通过pandas使用matplotlib创建条形图和折线图时,我遇到了一些不一致的行为。例如:
import matplotlib.pyplot as plt
import pandas as pd
from pandas_datareader import data
test_df = data.get_data_yahoo('AAPL', start='2015-10-01')
test_df['Adj Close'].plot()
使用合理的x轴标签预期绘图:
但是,如果您尝试从条形图中绘制来自同一数据帧的内容:
test_df['Volume'].plot(kind='bar')
x轴刻度标签不再自动合理。
这是pandas / matplotlib的预期行为吗?如何才能轻松纠正条形图上的x轴刻度标签,使其与上面的折线图中的相似?
答案 0 :(得分:3)
您可以告诉matplotlib显示每个第N个标签:
# show every Nth label
locs, labels = plt.xticks()
N = 10
plt.xticks(locs[::N], test_df.index[::N].strftime('%Y-%m-%d'))
import matplotlib.pyplot as plt
import pandas as pd
from pandas_datareader import data
test_df = data.get_data_yahoo('AAPL', start='2015-10-01')
fig, ax = plt.subplots(nrows=2)
test_df['Adj Close'].plot(ax=ax[0])
test_df['Volume'].plot(kind='bar', ax=ax[1])
# show every Nth label
locs, labels = plt.xticks()
N = 10
plt.xticks(locs[::N], test_df.index[::N].strftime('%Y-%m-%d'))
# autorotate the xlabels
fig.autofmt_xdate()
plt.show()
另一种选择是直接使用matplotlib:
import matplotlib.pyplot as plt
import pandas as pd
from pandas_datareader import data
import matplotlib.dates as mdates
df = data.get_data_yahoo('AAPL', start='2015-10-01')
fig, ax = plt.subplots(nrows=2, sharex=True)
ax[0].plot(df.index, df['Adj Close'])
ax[0].set_ylabel('price per share')
ax[1].bar(df.index, df['Volume']/10**6)
ax[1].xaxis.set_major_locator(mdates.MonthLocator(bymonthday=-1))
xfmt = mdates.DateFormatter('%B %d, %Y')
ax[1].xaxis.set_major_formatter(xfmt)
ax[1].set_ylabel('Volume (millions)')
# autorotate the xlabels
fig.autofmt_xdate()
plt.show()