xticks by pandas plot,用字符串重命名
Posted
技术标签:
【中文标题】xticks by pandas plot,用字符串重命名【英文标题】:Xticks by pandas plot, rename with the string 【发布时间】:2014-12-09 02:13:48 【问题描述】:我有这个df
:
df = pd.DataFrame('A': [1, 2, 3], 'B': [2, 3, 5], 'C': ['name 1', 'name 2', 'name 3'])
A B C
0 1 2 name 1
1 2 3 name 2
2 3 5 name 3
绘制列A
并将列C
用作xticks 的正确方法是什么?
这些不起作用:
df['A'].plot(xticks='C')
df['A'].plot(xticks=df['C'])
这会改变 xticks 但不会改变标签:
df['A'].plot(xticks=[1,2,3])
我真的应该转换为序列吗? 我也对这个问题进行了一些修改。我收到下一条错误消息:
ValueError: could not convert string to float: name 3
我有一列字符串,想在我的情节中将其用作 xticks。
附言
它不直接与 pandas 绘图功能一起使用。我找到了解决方案here
【问题讨论】:
【参考方案1】:您提供的链接是一个很好的资源,但显示了在matplotlib.pyplot
中完成的整个事情,并使用.subplots()
到达轴。虽然我以前这样做过,但我一直在寻找尽可能多地使用内置熊猫.plot()
功能的方法。对我来说,它可以简化代码并更容易利用 DataFrame 的优点。
不过,在df.plot()
的参数中,似乎确实有很多事情不容易做到。幸运的是,它返回了一个matplotlib.AxesSubplot
,这开辟了更大范围的可能性。
我把你上面的数据复制到了一个DataFrame中:
df = pd.read_clipboard(quotechar="'")
看起来有点像:
A B C
0 1 2 'name 1'
1 2 3 'name 2'
2 3 5 'name 3'
但是,当然,在非表格残缺的 html 中要好得多。 (也许有一天 SO 会解决这个问题)。
然后我要做的就是:
ax = df.A.plot(xticks=df.index, rot=90)
ax.set_xticklabels(df.C)
如果您使用的是 IPython/Jupyter 和 %matplotlib inline
,那么它们都需要在同一个单元格中。起初我忘记了这一点,花了很多时间试图找出问题所在。
您可以使用ax
变量完成所有操作:
ax = df.A.plot()
ax.set_xticks(df.index)
ax.set_xticklabels(df.C, rotation=90)
但是,正如我所提到的,我还没有找到在df.plot()
函数参数中使用xticklabels
的方法,这样就可以在一行中完成所有操作。
在这个例子中,旋转 xtick 标签的额外步骤可能是多余的,但在我正在寻找这个答案的时候派上用场。
当然,您可以更轻松地将 A 列和 B 列绘制在一起:
ax = df.plot()
ax.set_xticks(df.index)
ax.set_xticklabels(df.C, rotation=90)
【讨论】:
虽然当您问几乎相同的问题here时,您可能已经得到了这个答案。 看来 Pandas 仍然不提供重新标记刻度,并且您访问 matplotlib Axes 的解决方案在 2021 年仍然有效。这对我来说有点奇怪,因为为刻度指定文本标签似乎是一个非常普遍的需求。 【参考方案2】:从 matplotlib 3.5.0 开始
使用ax.set_xticks
和新的labels
参数同时设置刻度和标签:
ax = df.plot(y='A')
ax.set_xticks(ticks=df.index, labels=df.C)
# ^^^^^^
或者,由于df.plot
返回一个Axes
对象,我们可以链接它:
df.plot(y='A').set_xticks(df.index, df.C)
请注意,plt.xticks
始终有一个 labels
参数,因此此更改只是统一了 Axes
和 pyplot
API。
【讨论】:
以上是关于xticks by pandas plot,用字符串重命名的主要内容,如果未能解决你的问题,请参考以下文章
在 Plotly 中更改/更新 xtick 标签和 ytick 标签的不一致
如何旋转 xtick 标签条形图 plotly express?