gpt4 book ai didi

python - 使用 MaxNLocator 绘制 pandas 条形图会导致标签错误

转载 作者:行者123 更新时间:2023-12-01 09:28:10 25 4
gpt4 key购买 nike

我有一个 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: Finds up to a max number of intervals with ticks at nice locations. MultipleLocator: Ticks and range are a multiple of base; either integer or float.

但是它们都不是我期望看到的(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

<小时/>

我做错了什么?

最佳答案

问题

出现此问题是因为 pandas 条形图是分类的。每个条形图都位于从 0 开始的连续整数值处。仅调整标签以显示实际的数据帧索引。因此,这里有一个值为 0,1,2,3,...FixedLocator 和一个值为 -5 的 FixedFormatter ,-4,-3,...。单独更改定位器不会更改格式化程序,因此您会得到数字 -5, -4, -3, ... 但位于不同的位置(未显示一个勾号,因此绘图从-4 此处)。

A. Pandas 解决方案

除了设置定位器之外,您还需要设置一个格式化程序,它根据位置返回正确的值。对于此处使用的具有连续整数的数据帧索引,可以通过使用 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()

关于python - 使用 MaxNLocator 绘制 pandas 条形图会导致标签错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50194394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com