Home > Enterprise >  Subplots with counter like legends
Subplots with counter like legends

Time:11-16

I have written plot_dataframe() to create two subplots (one for line chart and another for histogram bar chart) for a dataframe that is passed via argument. Then I call this function from plot_kernels() with multiple dataframs.

def plot_dataframe(df, cnt):
    row = df.iloc[0].astype(int)  # First row in the dataframe
    plt.subplot(2, 1, 1)
    row.plot(legend=cnt)   # Line chart
    plt.subplot(2, 1, 2)
    df2 = row.value_counts()
    df2.reindex().plot(kind='bar', legend=cnt)   # Histogram
    

def plot_kernels(mydict2):
    plt.figure(figsize=(20, 15))
    cnt=1
    for key in my_dict2:
        df = my_dict2[key]
        plot_dataframe(df, cnt)
        cnt = cnt   1
    plt.show()

The dictionary looks like

{'K1::foo(bar::z(x,u))':    Value  Value
0     10      2
1      5      2
2     10      2, 'K3::foo(bar::y(z,u))':    Value  Value
0      6     12
1      7     13
2      8     14}

And based on the values in row[0], [10,2] are shown in blue line and [6,12] are shown in orange line. For histogram, they are similar. As you can see the legends in the subplots are shown as 0 in the figure. I expect to see 1 and 2. How can I fix that?

enter image description here

CodePudding user response:

Change legend to label, then force the legend after you plot everything:

def plot_dataframe(df, cnt,axes):
    row = df.iloc[0].astype(int)  # First row in the dataframe
    row.plot(label=cnt, ax=axes[0])   # Line chart -- use label, not legend
    df2 = row.value_counts()
    df2.plot(kind='bar', ax=axes[1], label=cnt)   # Histogram
    

def plot_kernels(d):
    # I'd create the axes first and pass to the plot function
    fig,axes = plt.subplots(2,1, figsize=(20, 15))
    cnt=1
    for key in d:
        df = d[key]
        plot_dataframe(df, cnt, axes=axes)
        cnt = cnt   1

    # render the legend
    for ax in axes:
        ax.legend()
    plt.show()

Output:

enter image description here

  • Related