【问题标题】:Convert pandas (python) categorical x-axis to continuous values when plotting绘图时将熊猫(python)分类x轴转换为连续值
【发布时间】:2016-08-15 09:04:28
【问题描述】:

我正在使用 matplotlib plot 命令(即series.plot(),其中series 是我的系列)在python 中绘制熊猫系列。该系列的部分内容如下:

(1, 1.1]      0.000000
(1.1, 1.2]    0.000000
(1.2, 1.3]    0.000000
(1.3, 1.4]    0.003115
(1.4, 1.5]    0.002625
(1.5, 1.6]    0.000000
(1.6, 1.7]    0.001464
...           ...
(4.9, 5.0]    0.737385
Name: series, dtype: float64

我的数据框图是shown here(本例中的红线)。我希望 x 轴从 1.0 变为 5.0,而不是显示 bin 类别。我怎样才能做到这一点?使用plt.xticks 似乎不起作用。

【问题讨论】:

  • 我想了解您的问题:您希望刻度标记为1.0, 1.1, 1.2, ... 5.0 还是(1.0, 1.5], (1.5, 2.0], ...
  • 是的,没错。或者,真的,[1.0,1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0] 会很好,但就是这样。
  • x 变量是存储为字符串的类别?
  • 老实说,我不确定。当我执行series.dtype 时,它返回dtype('float64'),但我认为这是在谈论最右边的列(即y 轴)。注意:它实际上是一个系列,而不是一个数据框。
  • 你能发布更多你的代码吗?

标签: python pandas matplotlib plot


【解决方案1】:

这个系列是从哪里来的?通常,我有一个连续值列XY 的大数据框,然后根据X 值定义X-binss。之后,按X-bins 分组以计算Y 的平均值(或加权平均值、总和或任何其他聚合函数),以获得与您类似的系列。如果是这种情况,我建议在此过程中计算X 的平均值,并根据平均值绘制X 而不是X-bins。这将比取 bin 的左/右端点或中点进行绘图更精确。例如,

df['Xbin'] = pd.cut(df['X'], np.arange(0,10,0.1))

代替

ser = df.groupby('Xbin')['Y'].mean()
ser.plot()

df2 = df.groupby('Xbin')[['X','Y']].mean()
df2.plot(x='X', y='Y')

【讨论】:

  • 感谢您的回复!你几乎读懂了我的想法。后一种方法效果更好,我确实在做前者。我肯定需要更熟悉groupby,因为它对我来说还是有点陌生​​。不过,您的解决方案很完美,非常感谢。
【解决方案2】:

根据我们的讨论,您的系列有一个索引,它是一串间隔,例如。 '(1,1.1]' 是系列中第一项的索引。

我能够使用以下代码重现您的问题:

import pandas as pd
import numpy as np

x1 = np.arange(0,5,.1)
x2 = np.arange(0.1,5.1,.1)
y = x1**2

df = pd.DataFrame(np.vstack((x1,x2,y)).T, columns=['x1','x2','y'])
df['xRange'] = '(' + df.x1.map(str) + ', ' + df.x2.map(str) + ']'
series = df.set_index('xRange', drop=True)['y']
series.plot()

要正确仅使用 series 对象标记刻度,您需要剥离索引并拉出间隔的第一部分。

您可以通过以下方式恢复数据框以进行绘图:

new_df = pd.DataFrame(series)
new_index = series.index.map(lambda s: float(s.split(',')[0].replace('(','')))
new_df.set_index(new_index, inplace=True)
new_df.plot()

【讨论】:

    猜你喜欢
    • 2021-05-08
    • 1970-01-01
    • 2018-07-19
    • 2019-05-01
    • 1970-01-01
    • 2016-04-10
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多