import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as dts
def use_matplot():
ax = df.plot(x='year', kind="area" )
years = dts.YearLocator(20)
ax.xaxis.set_major_locator(years)
fig = ax.get_figure()
fig.savefig('output.pdf')
dates = np.arange(1990,2061, 1)
dates = dates.astype('str').astype('datetime64')
df = pd.DataFrame(np.random.randint(0, dates.size, size=(dates.size,3)), columns=list('ABC'))
df['year'] = dates
cols = df.columns.tolist()
cols = [cols[-1]] + cols[:-1]
df = df[cols]
use_matplot()
在上面的代码中,我收到一个错误," ValueError:第0年超出范围"在尝试设置YearLocator时,以确保X轴每20年都有年份标签。默认情况下,情节每10年显示一次。我究竟做错了什么?期望的结果只是1990年,2010年,2030年,2050年底部的情节。 (而不是默认的1990年,2000年,2010年等)
答案 0 :(得分:0)
考虑使用set_xticklabels指定x轴刻度线的值:
ax.set_xticklabels(sum([[i,''] for i in range(1990, 2060, 20)], []))
# [1990, '', 2010, '', 2030, '', 2050, '']
答案 1 :(得分:0)
由于这些年份是简单的数字,您可以选择不将它们用作日期并将它们保留为数字。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
dates = np.arange(1990,2061, 1)
df = pd.DataFrame(np.random.randint(0,dates.size,size=(dates.size,3)),columns=list('ABC'))
df['year'] = dates
cols = df.columns.tolist()
cols = [cols[-1]] + cols[:-1]
df = df[cols]
ax = df.plot(x='year', kind="area" )
ax.set_xticks(range(2000,2061,20))
plt.show()
除此之外,在通过pandas创建的日期轴上使用Matplotlib定位器和格式化程序将most often fail。这是因为大熊猫使用完全不同的日期时间约定。为了更自由地为日期时间轴设置自定义代码,您可以使用matplotlib。可以使用plt.stackplot
绘制堆栈图。在这样的matplotlib图上,使用通常的matplotlib代码是没有问题的。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as dts
dates = np.arange(1990,2061, 1)
df = pd.DataFrame(np.random.randint(0,dates.size,size=(dates.size,3)),columns=list('ABC'))
df['year'] = pd.to_datetime(dates.astype(str))
cols = df.columns.tolist()
cols = [cols[-1]] + cols[:-1]
df = df[cols]
plt.stackplot(df["year"].values, df[list('ABC')].values.T)
years = dts.YearLocator(20)
plt.gca().xaxis.set_major_locator(years)
plt.margins(x=0)
plt.show()