使用MaxNLocator进行pandas条形图会导致标签错误

时间:2018-05-05 22:01:28

标签: python pandas matplotlib

我有一个pandas数据框,我想创建一个它的图:

import pandas as pd
from matplotlib.ticker import MultipleLocator, FormatStrFormatter, MaxNLocator
df = pd.DataFrame([1, 3, 3, 5, 10, 20, 11, 7, 2, 3, 1], range(-5, 6))
df.plot(kind='barh')

很好,一切都按预期工作:

enter image description here

现在我想隐藏y轴上的一些刻度。看看docs,我认为我可以通过以下方式实现:

  

MaxNLocator:查找最多间隔,间隔为nice   位置。 MultipleLocator:Ticks和range是base的倍数;   整数或浮点数。

但是他们两个都不是我期望看到的(y轴上的值没有显示正确的数字):

ax = df.plot(kind='barh')
ax.yaxis.set_major_locator(MultipleLocator(2))

enter image description here

ax = df.plot(kind='barh')
ax.yaxis.set_major_locator(MaxNLocator(3))

enter image description here

我做错了什么?

1 个答案:

答案 0 :(得分:1)

问题

问题出现是因为大熊猫条形图是绝对的。每个条都位于从0开始的连续整数值。仅调整标签以显示实际的数据框索引。因此,您的FixedLocator值为0,1,2,3,...FixedFormatter的值为-5, -4, -3, ...。单独更改定位器不会更改格式化程序,因此您可以获得数字-5, -4, -3, ...但在不同的位置(未显示一个刻度,因此此处的绘图从-4开始)。

一种。熊猫解决方案

除了设置定位器之外,您还需要设置一个格式化程序,它会返回正确的值作为位置的函数。如果数据帧索引具有此处使用的连续整数,则可以通过使用FuncFormatter将最小索引添加到位置来完成此操作。对于其他情况,FuncFormatter的功能可能会变得更加复杂。

import matplotlib.pyplot as plt
import pandas as pd
from matplotlib.ticker import (MultipleLocator, MaxNLocator, 
                                FuncFormatter, ScalarFormatter)

df = pd.DataFrame([1, 3, 3, 5, 10, 20, 11, 7, 2, 3, 1], range(-5, 6))

ax = df.plot(kind='barh')
ax.yaxis.set_major_locator(MultipleLocator(2))

sf = ScalarFormatter()
sf.create_dummy_axis()
sf.set_locs((df.index.max(), df.index.min()))

ax.yaxis.set_major_formatter(FuncFormatter(lambda x,p: sf(x+df.index[0])))


plt.show()

B中。 Matplotlib解决方案

使用matplotlib,解决方案可能更容易。由于matplotlib条形图本质上是数字的,因此它们将条形图定位在第一个参数的位置。在这里,单独设置定位器就足够了。

import matplotlib.pyplot as plt
import pandas as pd
from matplotlib.ticker import MultipleLocator, MaxNLocator

df = pd.DataFrame([1, 3, 3, 5, 10, 20, 11, 7, 2, 3, 1], range(-5, 6))

fig, ax = plt.subplots()
ax.barh(df.index, df.values[:,0])
ax.yaxis.set_major_locator(MultipleLocator(2))

plt.show()