web-dev-qa-db-fra.com

Comment tracer deux pandas séries chronologiques sur le même tracé avec des légendes et un axe y secondaire?

Je veux tracer deux séries chronologiques sur le même tracé avec le même axe x et l'axe y secondaire. J'ai en quelque sorte réalisé cela, mais deux légendes se chevauchent et ne peuvent pas donner d'étiquette à l'axe x et à l'axe y secondaire.J'ai essayé de mettre deux légendes en haut à gauche et en haut à droite, mais cela ne fonctionne toujours pas.

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

Merci d'avance

11
Om Prakash

Les solutions suivantes fonctionnent pour moi. La première place les deux lignes dans une légende, la seconde divise les lignes en deux légendes, similaire à ce que vous essayez ci-dessus.

Voici mon 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'))

Une solution de légende, crédit à this StackOverflow post

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

Solution de légende divisée

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

16
Josh

Cela peut être aussi simple que:

df.loc[:,['A','B']].plot(secondary_y=['B'], mark_right=False, figsize = (20,5), grid=True)

mark_right = False signifie que l'étiquette 'B' est sur l'axe gauche.

0
Sarah