【问题标题】:How I can create a multi plot cases?如何创建多情节案例?
【发布时间】:2021-03-09 18:56:24
【问题描述】:

我想以多情节案例的形式展示我的情节,如下图所示。我的代码是使用 python 和 matlpotlib 编写的。代码和图形也在下面。我还想用 S1、S2、S3 和 S4 替换 beseline、Intervention。提前致谢。

import numpy as np
import pandas as pd
from pandas import DataFrame
import matplotlib.pyplot as plt
from matplotlib import pyplot as plt
import seaborn as sns

 df = pd.DataFrame({'Time': ['1','2','3','4','5'],
       'S1': [74.92, 75.32, 79.64, 100, 101],
       'S2': [18.2,80,82,84, 90],
       'S3': [22,60,82,54, 70],
       'S4': [31,60,72,74, 90]
       })

 S1_lower_err = [73.3, 73.3, 75, 90, 108]
 S1_upper_err = [76, 80, 83.3, 107, 107]

 S1_lower_err = (S1_lower_err - df['S1']).abs() 
 S1_upper_err = (S1_upper_err - df['S1']).abs()

  yerr = [S1_lower_err, S1_upper_err]

  plt.errorbar('Time', 'S1', data=df, yerr=yerr, capsize=5, marker='s',            color='blue', markersize=4, linewidth=1, linestyle='--')

 S2_lower_err = [10, 70, 68, 90, 80]
 S2_upper_err = [40,80,90,90, 96]

 S2_lower_err = (S2_lower_err - df['S2']).abs() 
 S2_upper_err = (S2_upper_err - df['S2']).abs()

 yerr = [S2_lower_err, S2_upper_err]

 plt.errorbar('Time', 'S2', data=df, yerr=yerr, capsize=5, marker='o',  color='red', markersize=4, linewidth=1, linestyle='-')


 S3_lower_err = [12, 52, 80, 50, 65]
 S3_upper_err = [27,66,85,60, 76]

 S3_lower_err = (S3_lower_err - df['S2']).abs() 
 S3_upper_err = (S3_upper_err - df['S2']).abs()

  yerr = [S3_lower_err, S3_upper_err]

  plt.errorbar('Time', 'S3', data=df, yerr=yerr, capsize=5, marker='o',   color='green', markersize=4, linewidth=1, linestyle=':')

 S4_lower_err = [25, 50, 70, 70, 85]
 S4_upper_err = [33,66,77,80, 95]

 S4_lower_err = (S4_lower_err - df['S2']).abs() 
 S4_upper_err = (S4_upper_err - df['S2']).abs()

  yerr = [S4_lower_err, S4_upper_err]

  plt.errorbar('Time', 'S4', data=df, yerr=yerr, capsize=5, marker='o',  color='black', markersize=4, linewidth=1, linestyle='-.')

  plt.legend()
  plt.xlabel("Time")
  plt.ylabel("Performance")
  plt.ylim(-1, 120)
  plt.savefig('SixF.png', dpi=300, bbox_inches='tight')
  plt.show()

代码生成如下图。

【问题讨论】:

标签: python pandas matplotlib plot data-science


【解决方案1】:

编辑:添加错误字典,以便可以在每个循环中调用它们。

我重写了您的脚本,以便df.Time 列在每个循环中递增。让我知道您是否是这样想的。

%reset -f

import numpy as np
import pandas as pd
from pandas import DataFrame
import matplotlib.pyplot as plt
from matplotlib import pyplot as plt
import seaborn as sns

df = pd.DataFrame({'Time': ['1','2','3','4','5'],
   'S1': [74.92, 75.32, 79.64, 100, 101],
   'S2': [18.2,80,82,84, 90],
   'S3': [22,60,82,54, 70],
   'S4': [31,60,72,74, 90]
   })

df['Time'] = [int(i) for i in df['Time']]

lower_err_dict = {}
upper_err_dict = {}

lower_err_dict['S1'] = [73.3, 73.3, 75, 90, 108]
upper_err_dict['S1'] = [76, 80, 83.3, 107, 107]
lower_err_dict['S2'] = [10, 70, 68, 90, 80]
upper_err_dict['S2'] = [40,80,90,90, 96]
lower_err_dict['S3'] = [12, 52, 80, 50, 65]
upper_err_dict['S3'] = [27,66,85,60, 76]
lower_err_dict['S4'] = [25, 50, 70, 70, 85]
upper_err_dict['S4'] = [33,66,77,80, 95]

cols = ['S1','S2','S3','S4']
colors = ['blue','red','green','black',]

for col, col_color in zip(cols,colors):
    lower_err = lower_err_dict[col]
    upper_err = upper_err_dict[col]
    lower_err = (lower_err - df[col]).abs() 
    upper_err = (upper_err - df[col]).abs()
    yerr = [lower_err, upper_err]
    plt.errorbar('Time', col, data=df, yerr=yerr, capsize=5, marker='s', \
                 color=col_color, markersize=4, linewidth=1, linestyle='--')
    df.Time = df.Time + 5

plt.legend()
plt.xlabel("Time")
plt.ylabel("Performance")
plt.ylim(-1, 120)
plt.savefig('SixF.png', dpi=300, bbox_inches='tight')
plt.show()

此外,数据框正在将 Time 列变成一个对象,因此我必须将它们转换为整数,以便它们能够正确递增。

如果您不使用 jupyter 笔记本,请忽略 reset

【讨论】:

  • 感谢您的回复。该图看起来不错,但我如何编辑时间以显示每个图的 5 个时间间隔。另外,我可以通过栏将它们分开,为每个标题命名吗?
  • @Vincent Here 是如何使用共享轴堆叠子图的示例。 Sharing both axes 示例将它们垂直堆叠,但您可以根据预期的水平方向进行调整。
  • T先生知道怎么回事
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多