python-3.x - Python数据透视表自定义排序x轴
问题描述
我正在尝试创建一个数据透视表图,其中 x 轴是自定义排序的。我的代码:
import pandas as pd
data_dict = {
'x' : [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],
'y' : [9,10,11,12,13,14,15,1,2,3,4,5,6,7,8]
}
res_table = pd.DataFrame(data_dict)
df_pivot = pd.pivot_table(res_table,
index='x', values='y',
aggfunc='sum')
ax = df_pivot.plot(kind='line', marker='*', title='y data')
ax.set(xlabel='x', ylabel='y')
ax.legend(bbox_to_anchor=(1,1), loc="upper left")
ax.figure
这段代码给出了这个图:
现在我想更改 X 轴,使其从 8 到 15 开始,然后从 1 到 7。这样图形就变成了一条直线。
我试过这段代码:(熊猫数据透视表嵌套排序)
order = [8, 9, 10, 11, 12, 13, 14, 15, 1, 2, 3, 4, 5, 6, 7]
pd.concat([res_table.loc[res_table['x'] == val, :].set_index(['x']) for val in order])
但这似乎并没有改变什么。
*编辑:当然,我可以添加一个具有正确索引的额外列并使用它绘制图表,但我希望图表显示真实的 x 值。
**编辑:我庆祝得有点早。我的真实代码有额外的列可以在一张图上绘制多条这些线
data_dict = {
'x' : [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],
'y' : [9,10,11,12,13,14,15,1,2,3,4,5,6,7,8,29,30,31,32,33,34,35,21,22,23,24,25,26,27,28],
'z' : [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
}
res_table = pd.DataFrame(data_dict)
df_pivot = pd.pivot_table(res_table,
index='x', values='y',
aggfunc='sum', columns='z')
cut_val = 8
tmp_df = pd.concat((df_pivot.loc[cut_val:],
df_pivot.loc[:cut_val-1])).reset_index()
print(tmp_df)
fig, ax = plt.subplots()
ax.plot(tmp_df.index, tmp_df.y, '-o')
ticks = ax.get_xticks()
ax.set_xticklabels(tmp_df.loc[ticks, 'x'])
ax.figure
代码在此行停止,并在 tmp_df.y 上出现关键错误:
ax.plot(tmp_df.index, tmp_df.y, '-o')
如果没有 columns 参数,代码可以正常工作
解决方案
实际上,在这种特殊情况下,我们可以使用sort_value
andset_xticklabels
df_pivot = df_pivot.sort_values('y').reset_index()
fig, ax = plt.subplots()
ax.plot(df_pivot.index, df_pivot.y, '-o')
ticks = ax.get_xticks()
ax.set_xticklabels(df_pivot.loc[ticks, 'x'])
plt.show()
输出:
一般来说,您可以使用concat
然后set_xticklabels
以类似的方式
cut_val = 8
tmp_df = pd.concat((df_pivot.loc[cut_val:],
df_pivot.loc[:cut_val-1])).reset_index()
fig, ax = plt.subplots()
ax.plot(tmp_df.index, tmp_df.y, '-o')
ticks = ax.get_xticks()
ax.set_xticklabels(tmp_df.loc[ticks, 'x'])
plt.show()
对于您更新的数据框,tmp_df
实际上还有其他几列,非 is y
,由于以下值的唯一值z
:
cut_val = 8
tmp_df = pd.concat((df_pivot.loc[cut_val:],
df_pivot.loc[:cut_val-1])).reset_index()
fig, ax = plt.subplots()
tmp_df[df_pivot.columns].plot(ax=ax, marker='o')
ticks = ax.get_xticks()
ax.set_xticklabels(tmp_df.loc[ticks, 'x'])
plt.show()
输出:
推荐阅读
- android - TextInputEditText 填充在 ConstraintLayout 中不起作用
- reactjs - 为什么 onClick 函数不返回标签,在控制台中都很好
- python - 为什么 scipy sparse 和 numpy 数组的乘法函数会给出不同的结果?
- dax - TOPN - 得到不一致的结果
- ruby-on-rails - 如何将 rails_admin 记录保存到 mongoid
- android-emulator - 尝试向本地 GQL 端点发出请求时出现异常错误
- c# - .NET 的 POS - 扫描仪 - 什么可能导致某些二维码不触发 DataEvent 而其他二维码触发?
- r - R中的Glmnet vs Caret:在插入符号中出现错误但在glmnet中没有
- java - java.lang.ClassNotFoundException: org.apache.camel.Processor 部署战争到 weblogic 时
- perl - 意外调用字符串化运算符