在使用 pandas 绘图方法创建的图表上设置 x 轴格式

Format x-axis on chart created with pandas plot method

提问人:edge-case 提问时间:6/12/2017 更新时间:8/12/2018 访问量:19771

问:

熊猫。DataFrame.plot 是一种从 DataFrame 绘制数据的便捷方法。但是,我不明白如何使用此方法格式化轴。例如

import pandas as pd
import datetime

df = pd.DataFrame(index =  [datetime.datetime(2016, 7, 2, 0, 0),
                    datetime.datetime(2016, 8, 6, 0, 0),
                    datetime.datetime(2016, 9, 13, 0, 0),
                    datetime.datetime(2016, 10, 26, 0, 0),
                    datetime.datetime(2016, 11, 2, 0, 0)],
                    data = {'total' : [5, 3, 1, 0, 2]})

df

输出

          total
2016-07-02  5
2016-08-06  3
2016-09-13  1
2016-10-26  0
2016-11-02  2

现在用熊猫绘图方法绘图:

df.plot(kind='bar')

example bar chart

我宁愿 x 轴只将标签作为月份的三个字母格式 - 7 月 8 月 9 月 10 月 11 月。

这是否可能使用 pandas 绘图方法,或者我应该使用 matplotlib 构建图表?

Python Pandas Matplotlib 绘图

评论


答:

10赞 ImportanceOfBeingErnest 6/12/2017 #1

如果您想将图形显示为分类条形图,即与实际日期无关的等距条形图,您可以重新格式化 xticklabels,

f = lambda x: datetime.datetime.strptime(x, '%Y-%m-%d %H:%M:%S').strftime('%b')
ax.set_xticklabels([ f(x.get_text()) for x in ax.get_xticklabels()])

其中 是月份的缩写名称,斧头是绘图的轴。%b

完整示例:

import pandas as pd
import datetime
import matplotlib.pyplot as plt

df = pd.DataFrame(index =  [datetime.datetime(2016, 7, 2, 0, 0),
                    datetime.datetime(2016, 8, 6, 0, 0),
                    datetime.datetime(2016, 9, 13, 0, 0),
                    datetime.datetime(2016, 10, 26, 0, 0),
                    datetime.datetime(2016, 11, 2, 0, 0)],
                    data = {'total' : [5, 3, 1, 0, 2]})

ax = df.plot(kind='bar')

f = lambda x: datetime.datetime.strptime(x, '%Y-%m-%d %H:%M:%S').strftime('%b')
ax.set_xticklabels([ f(x.get_text()) for x in ax.get_xticklabels()])

plt.show()

enter image description here

14赞 edge-case 6/14/2017 #2

我找到了一种更简单的方法将 x 标签更改为仅月份。

import pandas as pd
import datetime

df = pd.DataFrame(index =  [datetime.datetime(2016, 7, 2, 0, 0),
                    datetime.datetime(2016, 8, 6, 0, 0),
                    datetime.datetime(2016, 9, 13, 0, 0),
                    datetime.datetime(2016, 10, 26, 0, 0),
                    datetime.datetime(2016, 11, 2, 0, 0)],
                    data = {'total' : [5, 3, 1, 0, 2]})

ax = df.plot(kind='bar')
x_labels = df.index.strftime('%b')
ax.set_xticklabels(x_labels)

plt.show()

example chart