【问题标题】:plot from pandas dataframe with negative and positive values从具有负值和正值的熊猫数据框中绘制
【发布时间】:2020-04-11 18:19:05
【问题描述】:

我有一个如下所示的数据框:

MM Initial Energy   MM Initial Angle    QM Energy   QM Angle
0   13.029277   120.0   18.048  120.0
1   11.173115   125.0   15.250  125.0
2   9.411475    130.0   12.668  130.0
3   7.762888    135.0   10.309  135.0
4   6.239025    140.0   8.180   140.0
5   4.853004    145.0   6.286   145.0
6   3.617394    150.0   4.633   150.0
7   2.544760    155.0   3.226   155.0
8   1.646335    160.0   2.070   160.0
9   0.934298    165.0   1.166   165.0
10  0.419003    170.0   0.519   170.0
11  0.105913    175.0   0.130   175.0
12  0.000000    -180.0  0.000   -180.0
13  0.105988    -175.0  0.130   -175.0
14  0.420029    -170.0  0.519   -170.0
15  0.937312    -165.0  1.166   -165.0
16  1.650080    -160.0  2.070   -160.0
17  2.548463    -155.0  3.227   -155.0
18  3.621227    -150.0  4.633   -150.0
19  4.856266    -145.0  6.286   -145.0
20  6.236939    -140.0  8.180   -140.0
21  7.760035    -135.0  10.309  -135.0
22  9.409117    -130.0  12.669  -130.0
23  11.170671   -125.0  15.251  -125.0
24  13.033293   -120.0  18.048  -120.0

我想用 x 轴上的角度和 y 轴上的能量来绘制数据。这听起来很简单,但是会发生什么是 pandas 或 matplotlib 以我的情节看起来分裂的方式对 X 轴值进行排序。这是它的样子:

然而,这就是我想要的:

我的代码如下:

df=pd.read_fwf('scan_c1c2c3h31_orig.txt', header=None, prefix='X')

df.rename(columns={'X0':'MM Initial Energy',
                          'X1':'MM Initial Angle',
                          'X2':'QM Energy', 'X3':'QM Angle'}, 
                 inplace=True)

df=df.sort_values(by=['MM Initial Angle'], axis=0, ascending=True)
df=df.reset_index(drop=False)

df2=pd.read_fwf('scan_c1c2c3h31.txt', header=None, prefix='X')
df2.rename(columns={'X0':'MM Energy',
                          'X1':'MM Angle',
                          'X2':'QM Energy', 'X3':'QM Angle'}, 
                 inplace=True)
df2=df2.sort_values(by=['MM Angle'], axis=0, ascending=True)
df2=df2.reset_index(drop=False)
df
df2
ax = plt.axes()

df.plot(y="MM Initial Energy", x="MM Initial Angle", color='red', linestyle='dashed',linewidth=2.0, ax=ax, fontsize=20, legend=True)

df2.plot(y="MM Energy", x="MM Angle", color='red', ax=ax, linewidth=2.0, fontsize=20, legend=True)

df2.plot(y="QM Energy", x="QM Angle", color='blue', ax=ax, linewidth=2.0, fontsize=20, legend=True)

plt.ylim(-0.05, 6)

ax.xaxis.set_major_locator(MultipleLocator(20))
ax.xaxis.set_minor_locator(MultipleLocator(10))
ax.yaxis.set_minor_locator(MultipleLocator(0.5))

plt.xlabel('Angles (Degrees)', fontsize=25)
plt.ylabel('Energy (kcal/mol)', fontsize=25)

我正在做的是,按“MM 角度”/“MM 初始角度”对数据框进行排序,以避免由于 y 轴上的重复值而导致绘图“混乱”。角度从 -180 到 180 不等,其中我希望 -180 和 +180 彼此相邻。

我尝试按照this post 中的建议对负值进行升序排序,对正值进行降序排序,但我仍然得到相同的图,其中 x 轴的范围从 -180 到 +180。 我还尝试了 matplotlib 轴 spines 以使绘图居中,并且我还尝试按照建议的 in this post 反转 x 轴,但仍然得到相同的绘图。此外,我还尝试了this another post 中的建议。 任何帮助将不胜感激。

【问题讨论】:

    标签: python pandas matplotlib plot


    【解决方案1】:

    如果您不需要重新调整绘图,我会针对正角0-360 进行绘图并手动重新标记刻度:

    fig, ax = plt.subplots()
    (df.assign(Angle=df['MM Initial Angle']%360)
       .plot(x='Angle', y=['QM Energy','MM Initial Energy'], ax=ax)
    )
    
    ax.xaxis.set_major_locator(MultipleLocator(20))
    
    x_ticks = ax.get_xticks()
    x_ticks = [t-360 if t>180 else t for t in x_ticks]
    ax.set_xticklabels(x_ticks)
    plt.plot()
    

    输出:

    【讨论】:

    • 非常感谢您的回答!它就像魅力一样!但是,我在 -180 和 180 合并的中心看到一个小间隙,可能是因为实际数据帧的最大角度值为 175,最小角度值为 -180。
    猜你喜欢
    • 1970-01-01
    • 2014-06-02
    • 2017-11-25
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 2022-12-06
    • 2014-02-13
    相关资源
    最近更新 更多