【问题标题】:Plot smoothing matplotlib and seaborn绘制平滑 matplotlib 和 seaborn
【发布时间】:2020-08-31 02:23:49
【问题描述】:

我正在尝试以一种很好的方式显示我的数据,例如在 seaborn 文档中看到的:

我不太确定如何进行。我设法获得了点的值及其各自的标准差,但它看起来很分散,而我只想显示一个趋势:

我研究了 herethere 尝试应用建议的解决方案,但我无法使其发挥作用。

这是我玩的:

Final_array =         Mean       Std
0   0.739269  0.157892
1   0.807382  0.160464
2   0.800024  0.137239
3   0.825854  0.132472
4   0.864854  0.070544
..       ...       ...
95  0.797202  0.101961
96  0.747578  0.143394
97  0.751472  0.158651
98  0.587009  0.198987
99  0.728447  0.104601

sns.set(style="darkgrid", palette="muted", color_codes=True)
fig, ax = plt.subplots(figsize=(7,5))
y_pos = np.arange(Final_array.shape[0])
ax.errorbar(y_pos, Final_array[:,0], yerr=Final_array[:,1], elinewidth=0.5)
plt.show()

有人有想法吗?我是使用情节的初学者。可以平滑吗?并获得像 seaborn 图像中的漂亮叠加层而不是误差线?

这些可能是愚蠢的问题。

亲切的问候,

【问题讨论】:

  • 为什么样条解决方案不适合您?
  • 由于我的数据没有排序,我无法使用样条进行平滑处理。

标签: python matplotlib seaborn smoothing


【解决方案1】:

您可以使用fillbetween 平滑上下曲线。选择更高的sigma 会更流畅。

下面是一些示例代码:

import matplotlib.pyplot as plt
import numpy as np
from scipy.ndimage.filters import gaussian_filter1d

x = np.linspace(0, 100, 100)
y = 0.95 - ((50 - x) / 200) ** 2
err = (1 - y) / 2
y += np.random.normal(0, err / 10, y.size)

upper = gaussian_filter1d(y + err, sigma=3)
lower = gaussian_filter1d(y - err, sigma=3)

fig, ax = plt.subplots(ncols=2)

ax[0].errorbar(x, y, err, color='dodgerblue')

ax[1].plot(x, y, color='dodgerblue')
ax[1].fill_between(x, upper, lower, color='crimson', alpha=0.2)

plt.show()

【讨论】:

    【解决方案2】:

    感谢您的帮助!我设法生成了我想要的图表!

    首先,样条线不起作用,因为我的数据没有排序。因此,我使用了@JohanC提出的gaussian_filter1d,也找到了here。然而,显然它可以改变数据(阅读here 的评论)所以我决定将这两个图一起绘制:

    使用这个最终版本:

    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    from scipy.ndimage.filters import gaussian_filter1d
    
    Final_array =         Mean       Std
    0   0.739269  0.157892
    1   0.807382  0.160464
    2   0.800024  0.137239
    3   0.825854  0.132472
    4   0.864854  0.070544
    ..       ...       ...
    95  0.797202  0.101961
    96  0.747578  0.143394
    97  0.751472  0.158651
    98  0.587009  0.198987
    99  0.728447  0.104601
    
    sns.set(style="darkgrid", palette="muted", color_codes=True)
    fig, ax = plt.subplots(figsize=(7,5))
    y_pos = np.arange(Final_array.shape[0])
    
    # Smoothing
    Final_array_smooth = gaussian_filter1d(Final_array[:,0], sigma=2)
    
    # Error formating
    upper_err = gaussian_filter1d(Final_array[:,0] + (Final_array[:,1]/2), sigma=5)
    lower_err = gaussian_filter1d(Final_array[:,0] - (Final_array[:,1]/2), sigma=5)
    
    ax.plot(y_pos, Final_array[:,0], '--', linewidth=0.7, color='k', alpha=0.45)
    ax.plot(y_pos, Final_array_smooth)
    ax.fill_between(y_pos, upper_err, lower_err, color='crimson', alpha=0.2)
    
    ax.set_ylim(np.min(Final_array[:,0])-(np.min((Final_array[:,0])*20)/100), np.max(Final_array[:,0])+(np.max((Final_array[:,0])*10)/100))
    plt.show()
    

    非常感谢!

    【讨论】:

      猜你喜欢
      • 2013-01-20
      • 1970-01-01
      • 2018-11-23
      • 2019-08-22
      • 2020-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      相关资源
      最近更新 更多