在绘图时将pandas(python)分类x轴转换为连续值

时间:2016-08-14 23:27:20

标签: python pandas matplotlib plot

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

(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似乎无效。

2 个答案:

答案 0 :(得分:1)

根据我们的讨论,您的系列的索引是一系列间隔,例如。 '(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()

答案 1 :(得分:0)

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

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

而不是

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

DO

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