在pandas bar plot中设置xticks

时间:2017-04-18 17:28:37

标签: python pandas matplotlib

我在下面的第三个示例图中遇到了这种不同的行为。为什么我能够使用pandas line()area()图正确编辑x轴'刻度,而不是bar()?修复(一般)第三个例子的最佳方法是什么?

import numpy as np
import pandas as pd
import matplotlib.ticker as ticker
import matplotlib.pyplot as plt

x = np.arange(73,145,1)
y = np.cos(x)

df = pd.Series(y,x)
ax1 = df.plot.line()
ax1.xaxis.set_major_locator(ticker.MultipleLocator(10))
ax1.xaxis.set_minor_locator(ticker.MultipleLocator(2.5))
plt.show()

ax2 = df.plot.area(stacked=False)
ax2.xaxis.set_major_locator(ticker.MultipleLocator(10))
ax2.xaxis.set_minor_locator(ticker.MultipleLocator(2.5))
plt.show()

ax3 = df.plot.bar()
ax3.xaxis.set_major_locator(ticker.MultipleLocator(10))
ax3.xaxis.set_minor_locator(ticker.MultipleLocator(2.5))
plt.show()

1 个答案:

答案 0 :(得分:2)

问题:

条形图旨在与分类数据一起使用。因此,条形实际上不在x的位置,而是在0,1,2,...N-1的位置。然后将条形标签调整为x的值 如果你只在每个第十个栏上打勾,那么第二个标签将放在第十个栏上。结果是

enter image description here

通过在轴上使用普通的ScalarFormatter,您可以看到条实际上位于从0开始的整数值:

ax3 = df.plot.bar()
ax3.xaxis.set_major_locator(ticker.MultipleLocator(10))
ax3.xaxis.set_minor_locator(ticker.MultipleLocator(2.5))
ax3.xaxis.set_major_formatter(ticker.ScalarFormatter())

enter image description here

现在您可以定义自己的固定格式化程序

n = 10
ax3 = df.plot.bar()
ax3.xaxis.set_major_locator(ticker.MultipleLocator(n))
ax3.xaxis.set_minor_locator(ticker.MultipleLocator(n/4.))
seq =  ax3.xaxis.get_major_formatter().seq
ax3.xaxis.set_major_formatter(ticker.FixedFormatter([""]+seq[::n]))

enter image description here

它的缺点是它以某个任意值开始。

解决方案:

我猜最好的通用解决方案是不要使用pandas plotting函数(无论如何只是一个包装器),而是直接使用matplotlib bar函数:

fig, ax3 = plt.subplots()
ax3.bar(df.index, df.values, width=0.72)
ax3.xaxis.set_major_locator(ticker.MultipleLocator(10))
ax3.xaxis.set_minor_locator(ticker.MultipleLocator(2.5))

enter image description here