首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算两个数据集之间的差距(熊猫、matplotlib、fill_between已经使用)

计算两个数据集之间的差距(熊猫、matplotlib、fill_between已经使用)
EN

Stack Overflow用户
提问于 2020-12-07 13:29:01
回答 2查看 50关注 0票数 0

我想请教一下,如何计算熊猫数据库中两个数据集之间的距离。理想情况下,我希望在绘图中写入这些gap值,并且,如果可能的话,将它们包含到dataframe中。下面是我简化的dataframe示例:

代码语言:javascript
复制
import pandas as pd
d = {'Mean-1': [0.195842, 0.295069, 0.321345, 0.773725], 'SEM-1': [0.001216, 0.002687, 0.005267, 0.029974], 'Mean-2': [0.143103, 0.250505, 0.305767, 0.960804],'SEM-2': [0.000959, 0.001368, 0.003722, 0.150025], 'Atom Number': [1, 3, 5, 7]}
df=pd.DataFrame(d)
df

    Mean-1      SEM-1       Mean-2      SEM-2     Atom Number
0   0.195842    0.001216    0.143103    0.000959    1
1   0.295069    0.002687    0.250505    0.001368    3
2   0.321345    0.005267    0.305767    0.003722    5
3   0.773725    0.029974    0.960804    0.150025    7

然后我画了个图,在这里我们可以看到两条线代表平均值-1和平均值-2,然后在每条线周围的阴影区域代表平均值的标准误差。这是为选定的原子数所做的。

代码语言:javascript
复制
import matplotlib.pyplot as plt

ax = df.plot(x='Atom Number', y=['Mean-1','Mean-2'])

y_1 = df['Mean-1']
y_2 = df['Mean-2']
x = df['Atom Number']

error_1 = df['SEM-1']
error_2 = df['SEM-1']

ax.fill_between(df['Atom Number'], y_1-error_1, y_1+error_1, alpha=0.2, edgecolor='#CC4F1B', facecolor='#FF9848')
ax.fill_between(df['Atom Number'], y_2-error_2, y_2+error_2, alpha=0.2, edgecolor='#3F7F4C', facecolor='#7EFF99')
plt.xticks(x)

我想进一步做的是计算每一个残余物的间隙。的空白是,因此空间中的线条和阴影区域(SEM)不重叠。同时也想知道我是否能以某种方式打印出图中的间隙值?并将它们保存到列中。谢谢你的建议。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-07 14:17:45

这不是一个紧凑的解决方案,但是您可以尝试这样的方法(检查事情的顺序)。计算所有位置(y_i和上、下限)。

代码语言:javascript
复制
import numpy as np
df['y1_upper'] = y_1+error_1
df['y1_lower'] = y_1-error_1
df['y2_upper'] = y_2+error_2
df['y2_lower'] = y_2-error_2

这给

代码语言:javascript
复制
    Mean-1     SEM-1    Mean-2     SEM-2  Atom Number  y1_upper  y1_lower  \
0  0.195842  0.001216  0.143103  0.000959            1  0.197058  0.194626   
1  0.295069  0.002687  0.250505  0.001368            3  0.297756  0.292382   
2  0.321345  0.005267  0.305767  0.003722            5  0.326612  0.316078   
3  0.773725  0.029974  0.960804  0.150025            7  0.803699  0.743751   

   y2_upper  y2_lower     
0  0.144319  0.141887  
1  0.253192  0.247818  
2  0.311034  0.300500  
3  0.990778  0.930830  

距离(间隙)的计算是不同的,这取决于y_1是否在y_2之上,反之亦然。因此,使用上、下界的条件,并使用linalg.norm计算距离。

代码语言:javascript
复制
conditions = [
    (df['y1_lower'] >= df['y2_upper']),
    (df['y1_lower'] < df['y2_upper'])]
choices = [np.linalg.norm(df['y1_lower']-df['y2_upper']), np.linalg.norm(df['y2_lower']-df['y1_upper'])]
df['dist'] = np.select(conditions, choices)

这给了我们

代码语言:javascript
复制
    Mean-1     SEM-1    Mean-2     SEM-2  Atom Number  y1_upper  y1_lower  \
0  0.195842  0.001216  0.143103  0.000959            1  0.197058  0.194626   
1  0.295069  0.002687  0.250505  0.001368            3  0.297756  0.292382   
2  0.321345  0.005267  0.305767  0.003722            5  0.326612  0.316078   
3  0.773725  0.029974  0.960804  0.150025            7  0.803699  0.743751   

   y2_upper  y2_lower      dist  
0  0.144319  0.141887  0.255175  
1  0.253192  0.247818  0.255175  
2  0.311034  0.300500  0.255175  
3  0.990778  0.930830  0.149605  

正如我所说,检查订单,但这是一个可能的解决方案。

票数 1
EN

Stack Overflow用户

发布于 2020-12-07 14:16:42

你想要这样的东西吗?

代码语言:javascript
复制
import matplotlib.pyplot as plt

ax = df.plot(x='Atom Number', y=['Mean-1','Mean-2'], figsize=(15,8))

y_1 = df['Mean-1']
y_2 = df['Mean-2']
x = df['Atom Number']

error_1 = df['SEM-1']
error_2 = df['SEM-1']

ax.fill_between(df['Atom Number'], y_1-error_1, y_1+error_1, alpha=0.2, edgecolor='#CC4F1B', facecolor='#FF9848')
ax.fill_between(df['Atom Number'], y_2-error_2, y_2+error_2, alpha=0.2, edgecolor='#3F7F4C', facecolor='#7EFF99')
ax.fill_between(df['Atom Number'], y_1+error_1, y_2-error_2, alpha=.2, edgecolor='k', facecolor='blue')

for i in range(len(x)):
    gap = y_1[i]+error_1[i] - y_2[i]-error_2[i]
    ylabel = min(y_1[i], y_2[i]) + abs(gap) / 2
    _ = ax.annotate(f'{gap:0.4f}', xy=(x[i],ylabel), xytext=(x[i]-.14,y_1[i]+gap/abs(gap)*.2), arrowprops=dict(arrowstyle="-"))
plt.xticks(x);

输出:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65182638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档