Matplotlib: how to show legend elements horizontally?
I'd like to set the legend to be displayed horizontally. I do not mean the text of the legend like described in the post Matplotlib legend vertical rotation. My actual case includes an arbitrary number of series specified with a widget. But the following example represents the gist of the challenge:
Snippet:
# Imports
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# data
np.random.seed(123)
x = pd.Series(np.random.randn(100),index=pd.date_range('1/1/2000', periods=100)).cumsum()
y = pd.Series(np.random.randn(100),index=pd.date_range('1/1/2000', periods=100)).cumsum()
z = pd.Series(np.random.randn(100),index=pd.date_range('1/1/2000', periods=100)).cumsum()
df = pd.concat([x,y,z], axis = 1)
# plot
ax = plt.subplot()
for col in (df.columns):
plt.plot(df[col])
plt.legend(loc="lower left")
plt.xticks(rotation=90)
plt.show()
Plot:
The default layout seems to be vertical.
Looking at the details of help(ax.legend)
and the docs , there does not seem to be a straight forward way to change this to horizontal. Or is there?
Edit - Desired Legend: (using MS Paint)
Specify the ncol
parameter in legend. In your case something like:
plt.legend(loc="lower left", ncol=len(df.columns))
This is the only line I changed in your script.
Working full code:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# data
np.random.seed(123)
x = pd.Series(np.random.randn(100),index=pd.date_range('1/1/2000', periods=100)).cumsum()
y = pd.Series(np.random.randn(100),index=pd.date_range('1/1/2000', periods=100)).cumsum()
z = pd.Series(np.random.randn(100),index=pd.date_range('1/1/2000', periods=100)).cumsum()
df = pd.concat([x,y,z], axis = 1)
# plot
ax = plt.subplot()
for col in (df.columns):
plt.plot(df[col])
plt.legend(loc="lower left", ncol=len(df.columns))
plt.xticks(rotation=90)
plt.show()
I believe by horizontal, you mean that you want the legend to list the points next to each other instead of vertically.
plt.legend(loc="lower left", mode = "expand", ncol = 3) #expand stretches it along the bottom
# while ncol specifies the number of columns
https://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.legend
You want to specify the ncol
:
plt.legend(loc="lower left", ncol = len(ax.lines) )