如何在Pandas DataFrame区域图上更改年份间隔?

时间:2017-10-12 22:07:13

标签: python pandas matplotlib

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年等)

2 个答案:

答案 0 :(得分:0)

考虑使用set_xticklabels指定x轴刻度线的值:

ax.set_xticklabels(sum([[i,''] for i in range(1990, 2060, 20)], []))
# [1990, '', 2010, '', 2030, '', 2050, '']

Image Output

答案 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()

enter image description here

除此之外,在通过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()

enter image description here