绘制具有任意中心且 x 轴在两个方向上为正的数据

Posted

技术标签:

【中文标题】绘制具有任意中心且 x 轴在两个方向上为正的数据【英文标题】:Plotting data with arbitrary center and x axis positive in both directions 【发布时间】:2019-11-11 11:14:27 【问题描述】:

我正在写一篇论文,我的数据显示了我的分子的结构变化。这些结构变化正在反转 d 轨道排列。

为了显示逐渐反转,我想绘制一个图形,显示完美结构(所有键 = 2.1)作为我的 x 轴的中心,如果我逐渐将两个键从2.1 到 2.2。右边的轴也是正的,从中心 2.1 开始到 2.2(但显示了只改变一个键会发生什么)。

这里有一张图来说明我的意图:

到目前为止,我能做到的最好的是:

plt.figure(figsize=(9, 8))
dxy = sns.stripplot(x="Bond", y="Energy(cm-1)", data=dfbd, jitter=False, dodge=False, size=44, marker="_", linewidth=2, hue="Orbital")
plt.ylabel("Energy (Eh)")

如果您想尝试一下或对如何实现这一点有任何见解,我将非常感激。

这是 CSV 中的数据:

,Type,Bond,Orbital,Energy(cm-1)
0,D4h,2.1,dyz,0.0
1,D4h,2.1,dyz,1.2
2,D4h,2.1,dxz,6.0
3,D4h,2.1,dx2-y2,6473.1
4,D4h,2.1,dz2,6491.1
5,D4h,2.12,dxz,0.0
6,D4h,2.12,dyz,62.9
7,D4h,2.12,dxy,84.3
8,D4h,2.12,dz2,6233.7
9,D4h,2.12,dx2-y2,6560.8
10,D4h,2.14,dxz,0.0
11,D4h,2.14,dyz,125.9
12,D4h,2.14,dxy,171.2
13,D4h,2.14,dz2,5992.8
14,D4h,2.14,dx2-y2,6650.5
15,D4h,2.16,dxz,0.0
16,D4h,2.16,dyz,184.7
17,D4h,2.16,dxy,254.8
18,D4h,2.16,dz2,5761.5
19,D4h,2.16,dx2-y2,6736.9
20,D4h,2.18,dxz,0.0
21,D4h,2.18,dyz,239.4
22,D4h,2.18,dxy,335.4
23,D4h,2.18,dz2,5539.6
24,D4h,2.18,dx2-y2,6820.6
25,D4h,2.2,dxz,0.0
26,D4h,2.2,dyz,290.4
27,D4h,2.2,dxy,413.0
28,D4h,2.2,dz2,5327.0
29,D4h,2.2,dx2-y2,6901.5
30,D4h*,2.1,dyz,0.0
31,D4h*,2.1,dyz,1.2
32,D4h*,2.1,dxz,6.0
33,D4h*,2.1,dx2-y2,6473.1
34,D4h*,2.1,dz2,6491.1
35,D4h*,2.12,dxz,0.0
36,D4h*,2.12,dyz,29.0
37,D4h*,2.12,dxy,39.1
38,D4h*,2.12,dz2,6359.1
39,D4h*,2.12,dx2-y2,6514.3
40,D4h*,2.14,dxz,0.0
41,D4h*,2.14,dyz,60.6
42,D4h*,2.14,dxy,82.5
43,D4h*,2.14,dz2,6239.0
44,D4h*,2.14,dx2-y2,6559.1
45,D4h*,2.16,dxz,0.0
46,D4h*,2.16,dyz,90.0
47,D4h*,2.16,dxy,124.3
48,D4h*,2.16,dz2,6123.8
49,D4h*,2.16,dx2-y2,6602.2
50,D4h*,2.18,dxz,0.0
51,D4h*,2.18,dyz,117.3
52,D4h*,2.18,dxy,164.5
53,D4h*,2.18,dz2,6013.3
54,D4h*,2.18,dx2-y2,6643.9
55,D4h*,2.2,dxz,0.0
56,D4h*,2.2,dyz,142.9
57,D4h*,2.2,dxy,203.2
58,D4h*,2.2,dz2,5907.6
59,D4h*,2.2,dx2-y2,6684.2

【问题讨论】:

澄清一下,D4h 类型是不是两个键都发生了变化,而 D4h* 类型是只有一个键发生了变化? @PeterLeimbigler,是的。 D4h 更改了 2 个键,由于没有更好的名称,我将 1 个键的情况称为 D4h*。 您通常有两种选择。 (1) 伪造标签;即绘制一些越来越多的数字,根据需要标记它们。 (2) 创建两个轴,中间没有间隙,左侧 x 轴倒置。 【参考方案1】:

根据@ImportanceOfBeingErnest 的评论,我倾向于选择“假轴”路线,因为它避免了使用多个轴、多个标签、图例等...

df.loc[:,'fake_Bond'] = df.Bond
df.loc[df.Type=='D4h', 'fake_Bond'] = 2.0 + abs(df.loc[df.Type=='D4h', 'Bond'] - 2.2)

plt.figure(figsize=(9, 8))
dxy = sns.stripplot(x="fake_Bond", y="Energy(cm-1)", data=df, jitter=False, dodge=False, size=44, marker="_", linewidth=2, hue="Orbital")
plt.ylabel("Energy (Eh)")

dxy.set_xticklabels(np.concatenate([np.linspace(2.2,2.1,6),np.linspace(2.12,2.2,5)]))
dxy.set_xlabel("D4h $\longleftarrow$ Bond $\longrightarrow$ D4h*")

【讨论】:

亲爱的 Diziet,感谢您的回答。它真的很有效!。

以上是关于绘制具有任意中心且 x 轴在两个方向上为正的数据的主要内容,如果未能解决你的问题,请参考以下文章

Accuarcy and Precision

两个平行的坐标系点的坐标有啥规律

最小生成树

PR详解及二分类的PR曲线绘制

MFC开发绘图程序时,工作窗口坐标系是怎么样的,坐标原点在哪里

Pyqtgraph:在同一个图形窗口中实时绘制两个图形相同的X轴但两个不同的Y轴方向相反