How to build two pandas time cycles on the same plot with legends and secondary y axis?

I want to build two time series on the same chart with the same x axis and secondary y axis. I somehow achieved this, but two legends overlap and cannot give a label to the x axis and the secondary y axis. I tried putting two legends in the upper left and upper right, but it still doesn't work.

code:

plt.figure(figsize=(12,5)) # Number of request every 10 minutes log_10minutely_count_Series = log_df['IP'].resample('10min').count() log_10minutely_count_Series.name="Count" log_10minutely_count_Series.plot(color='blue', grid=True) plt.legend(loc='upper left') plt.xlabel('Number of request ever 10 minute') # Sum of response size over each 10 minute log_10minutely_sum_Series = log_df['Bytes'].resample('10min').sum() log_10minutely_sum_Series.name = 'Sum' log_10minutely_sum_Series.plot(color='red',grid=True, secondary_y=True) plt.legend(loc='upper right') plt.show() 

enter image description here

Thank you in advance

+5
source share
1 answer

The following solutions work for me. The first puts both lines in one legend, the second divides the lines into two legends, similar to what you are trying to do above.

Here is my dataframe

 ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000)) df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=list('ABCD')) 

One Legend Solution, StackOverflow post credit

 plt.figure(figsize=(12,5)) plt.xlabel('Number of requests every 10 minutes') ax1 = df.A.plot(color='blue', grid=True, label='Count') ax2 = df.B.plot(color='red', grid=True, secondary_y=True, label='Sum') h1, l1 = ax1.get_legend_handles_labels() h2, l2 = ax2.get_legend_handles_labels() plt.legend(h1+h2, l1+l2, loc=2) plt.show() 

One legend matplotlib plot

Sharing a Legendary Decision

 plt.figure(figsize=(12,5)) plt.xlabel('Number of requests every 10 minutes') ax1 = df.A.plot(color='blue', grid=True, label='Count') ax2 = df.B.plot(color='red', grid=True, secondary_y=True, label='Sum') ax1.legend(loc=1) ax2.legend(loc=2) plt.show() 

Split legend matplotlib plot

+6
source

Source: https://habr.com/ru/post/1271447/


All Articles