【问题标题】:Xticks by pandas plot, rename with the stringxticks by pandas plot,用字符串重命名
【发布时间】: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

【问题讨论】:

    标签: python pandas plot


    【解决方案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 参数,因此此更改只是统一了 Axespyplot API。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      • 2020-06-07
      • 2019-02-17
      • 1970-01-01
      • 2017-05-26
      相关资源
      最近更新 更多