我有一个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')
很好,一切都按预期工作:
现在我想隐藏y轴上的一些刻度。看看docs,我认为我可以通过以下方式实现:
MaxNLocator:查找最多间隔,间隔为nice 位置。 MultipleLocator:Ticks和range是base的倍数; 整数或浮点数。
但是他们两个都不是我期望看到的(y轴上的值没有显示正确的数字):
ax = df.plot(kind='barh')
ax.yaxis.set_major_locator(MultipleLocator(2))
ax = df.plot(kind='barh')
ax.yaxis.set_major_locator(MaxNLocator(3))
我做错了什么?
答案 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()
使用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()