def grid_plot(rows, cols, plot_func, row_names=None, col_names=None, figsize=None, *args, **kwargs):
    row_names = (row_names or [str(row) for row in rows])
    col_names = (col_names or [str(col) for col in cols])
    figsize = (figsize or get_figsize_default(len(cols), len(rows)))
    (fig, axs) = plt.subplots(nrows=len(rows), ncols=len(cols), figsize=figsize)
    axs = axs.reshape(len(rows), len(cols))
    for (row_axs, row, row_name) in zip(axs, rows, row_names):
        for (ax, col, col_name) in zip(row_axs, cols, col_names):
            title = ':'.join([row_name, col_name])
            plot_func(row, col, title, *args, ax=ax, **kwargs)
def grid_plot(rows, cols, plot_func, row_names=None, col_names=None, figsize=None, *args, **kwargs):
    row_names = (row_names or [str(row) for row in rows])
    col_names = (col_names or [str(col) for col in cols])
    figsize = (figsize or get_figsize_default(len(cols), len(rows)))
    (fig, axs) = plt.subplots(nrows=len(rows), ncols=len(cols), figsize=figsize)
    axs = axs.reshape(len(rows), len(cols))
    for (row_axs, row, row_name) in zip(axs, rows, row_names):
        for (ax, col, col_name) in zip(row_axs, cols, col_names):
            title = ':'.join([row_name, col_name])
            plot_func(row, col, title, *args, ax=ax, **kwargs)