绘制后可以在Python绘图中对x轴进行排序吗?

时间:2018-09-06 19:48:14

标签: python matplotlib jupyter-notebook

我试图在一张图中绘制来自两个不同数据框的两列。 我已经找到了将其绘制成一个的代码,但是x轴需要按升序排列。在这种情况下,我们可以这样做吗?

df1=pd.DataFrame({ 'ID': ['A1','A2','A6','A7','A9'], 'F1_S': [23,75,42,77,54] },
                 columns=['ID', 'F1_S'])
df2=pd.DataFrame({ 'ID': ['A3','A4','A5','A8'], 'F1_S': [66,43,56,86] },
                 columns=['ID', 'F1_S'])
x1 = list(df1['ID'])
y1= list(df1['F1_S'])
lists1 = sorted(zip(*[x, y1]))
x1, y1 = zip(*sorted(zip(x1, y1)))

x2 = list(df2['ID'])
y2= list(df2['F1_S'])
lists2 = sorted(zip(*[x2, y2]))
x2, y2 = zip(*sorted(zip(x2, y2)))

plt.plot (x1,y1)
plt.plot(x2,y2)

3 个答案:

答案 0 :(得分:1)

一种可能的解决方案是根据数字索引绘制连接的数据框,并将刻度线设置为类别。

wilcox_test_matrix

#             X0ct_perfusion_flow                                
# statistic   1198                                               
# parameter   NULL                                               
# p.value     0.7225658                                          
# null.value  0                                                  
# alternative "two.sided"                                        
# method      "Wilcoxon rank sum test with continuity correction"
#             X0ipss                                             
# statistic   1339                                               
# parameter   NULL                                               
# p.value     0.5417935                                          
# null.value  0                                                  
# alternative "two.sided"                                        
# method      "Wilcoxon rank sum test with continuity correction"
#             X0oiief                                            
# statistic   1206                                               
# parameter   NULL                                               
# p.value     0.7642678                                          
# null.value  0                                                  
# alternative "two.sided"                                        
# method      "Wilcoxon rank sum test with continuity correction"
# ...

enter image description here

答案 1 :(得分:0)

为什么不将两者串联?

pd.concat([df1[['ID', 'F1_S']], df2[['ID', 'F1_S']])\
  .sort_values(by='ID')\
  .plot(x='ID', y='F1_S')

编辑:将它们分开绘制在同一轴上:

fig, ax = plt.subplots()
df1.sort_values(by='ID')\
   .plot(x='ID', y='F1_S', ax=ax)
df2.sort_values(by='ID')\
   .plot(x='ID', y='F1_S', ax=ax)

df.plot的调用接受与plt.plot相同的kwarg,因此您可以为每种颜色指定不同的颜色。

答案 2 :(得分:0)

不确定这是否完全是您想要的东西,但是这里有:

import pandas as pd
import matplotlib.pyplot as plt


df1 = pd.DataFrame({'ID': ['A1', 'A2', 'A6', 'A7', 'A9'],
                    'F1_S': [23, 75, 42, 77, 54]},
                   columns=['ID', 'F1_S'])
df2 = pd.DataFrame({'ID': ['A3', 'A4', 'A5', 'A8'],
                    'F1_S': [66, 43, 56, 86]},
                   columns=['ID', 'F1_S'])

df1.set_index('ID', inplace=True)
df1.index.name = None
df1.columns = ['F1_S_1']
df2.set_index('ID', inplace=True)
df2.index.name = None
df2.columns = ['F1_S_2']
df = pd.concat([df1, df2], sort=True).sort_index().interpolate(limit_area='inside')
ax = df.plot()
ax.set_xticklabels(['A0'] + df.index.tolist())
plt.show()

结果是这样的:

enter image description here

df.plot()似乎在轴标签上出现了一个错误,我不得不将一个假元素侵入xlabel列表中才能使其正确显示。