[英]histogram subplots with multiple axes
我有 4 组(即 bbs)的 3.csv 文件(即副本),每组有 2 列:时间(X 轴)和交互频率(Y 轴 1)。 我还需要 plot 误差条到我已经实现的第二个 y 轴。 由于它们具有相似的路径,因此我通过 filename = 读取它们,每个集合和副本都带有 %s 。
现在我可以一个接一个地 plot ,但我想要实现的是:
为 plot 创建一个子图,将每组的所有副本放入一个无花果中,以将它们一起保存在一个 jpg 中。 并且没有 12 jpg。 数字
为每个复制品配备三种颜色的循环仪,以便在最终图中区分它们,并为每个图加上一个共同的图例
并最终有一个共同的 y 轴范围,因此结果在视觉上具有可比性,因为我比较了直方图中的频率。
到目前为止,这是我的代码:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
bbss = [60,80,100,120]
replicas = ["1", "2", "3"]
colors = ['tab:blue', 'tab:orange', 'tab:green']
for bbs in bbss:
for i, replica in enumerate(replicas):
filename = "elliottIV_HA_IHSS/box4x4x4/bbs%s/bbpm2/NA/pH7.0/r%s/analysis/mdf/MIN_1:13.dat" % (bbs, replica)
data = pd.read_csv(filename, engine='python', delimiter="\s+|:", names=["time", "distance", "mol", "atom"], usecols=[0,1,3,4])
fig, ax1 = plt.subplots()
data["mol"] -= 1
data["mol"].plot.hist(figsize=(15, 5), rwidth=0.8, bins=range(1,int(bbs/2+2)), align="left", ax=ax1)
plt.suptitle('Replica-{}, {} building blocks:'.format(replica, bbs), fontsize=14)
plt.xticks(range(1,int(bbs/2+1)))
plt.xlabel("Molecule Nr.")
#plt.savefig('{}bbs.jpg'.format(bbs), bbox_inches='tight')
#plt.clf()
ax2 = ax1.twinx()
m = data.groupby("mol").mean()["distance"].values
s = data.groupby("mol").std()["distance"].values
i = data.groupby("mol").mean().index.values
ax2.errorbar(i, m, yerr=s, marker="o", fmt="none", color="tab:red")
ax2.set_ylabel("Distance [nm]")
fig.tight_layout()
plt.show()
dataframe 看起来像这样:
time distance mol atom
0 0.0 0.368683 16 3
1 1.0 0.364314 16 1
2 2.0 0.358840 16 3
3 3.0 0.321033 16 3
4 4.0 0.361127 16 3
... ... ... ... ...
249995 249995.0 0.536088 13 3
249996 249996.0 0.508320 13 3
249997 249997.0 0.475273 13 3
249998 249998.0 0.559773 13 3
249999 249999.0 0.515042 7 11
y轴1上的频率显示每个“mol”出现的频率(有30个)X显然是有250k时间步长的时间,第二个y轴显示每个“mol”的距离列的平均值mol”以及错误和st.dev
希望能澄清一点-谢谢!
为简单起见,我创建了以下数据集:
data = pd.DataFrame([[0.0, 0.368683 , 16,3], [1.0, 0.364314 , 15, 1], [2.0 , 0.358840 , 16 , 3], [3.0 , 0.321033 , 17 , 3], [4.0 , 0.361127 ,17 , 3]],
columns=["time", "distance", "mol", "atom"])
Afterwarfs 我通过以下代码通过以下代码行创建了所需的三个图:
bbss = [60,80,100,120]^M
replicas = ["1", "2", "3"]^M
colors = ['blue', 'orange', 'green']^M
for bbs in bbss:^M
fig, axes = plt.subplots(3,1)
plt.xticks(range(1,int(bbs/2+1)))
plt.xlabel("Molecule Nr.")
for i, replica in enumerate(replicas):
filename = "elliottIV_HA_IHSS/box4x4x4/bbs%s/bbpm2/NA/pH7.0/r%s/analysis/mdf/MIN_1:13.dat" % (bbs, replica)^M
# data = pd.read_csv(filename, engine='python', delimiter="\s+|:", names=["time", "distance", "mol", "atom"], usecols=[0,1,3,4])
data["mol"] -= 1
ax = axes[i]
data["mol"].plot.hist(figsize=(15, 5), rwidth=0.8, bins=range(1,int(bbs/2+2)), color=colors[i], align="left", ax=ax)
ax2 = ax.twinx()
m = data.groupby("mol").mean()["distance"].values
s = data.groupby("mol").std()["distance"].values
i = data.groupby("mol").mean().index.values
ax2.errorbar(i, m, yerr=s, marker="o", fmt="none", color="tab:red")
ax2.set_ylabel("Distance [nm]")
plt.suptitle('Replica-{}, {} building blocks:'.format(replica, bbs), fontsize=14)
fig.tight_layout()
plt.show()
请注意您的解决方案,您应该取消注释读取数据的行。 生成的 plot 如下所示:
我希望这是您正在寻找的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.