【问题标题】:How can smooth heatmap plots easily in Seaborn?如何在 Seaborn 中轻松平滑热图?
【发布时间】:2019-01-23 18:56:18
【问题描述】:

我想知道是否有任何选项可以制作以下图片,这些图片是sns.heatmap(df) subplots smoothy的输出: 我刚刚找到了一个相关答案here,建议使用zsmooth

data = [go.Heatmap(z=[[1, 20, 30],
                      [20, 1, 60],
                      [30, 60, 1]],
                   zsmooth = 'best')]
iplot(data)

我使用seaborn的代码的sn-p如下:

#plotting all columns ['A','B','C'] in-one-window side by side
fig, axes = plt.subplots(nrows=1, ncols=3 , figsize=(20,10))

plt.subplot(131)
sns.heatmap(df1, vmin=-1, vmax=1, cmap ="coolwarm", linewidths=.75 , linecolor='black', cbar=True , cbar_kws={"ticks":[-1.0,-0.75,-0.5,-0.25,0.00,0.25,0.5,0.75,1.0]})
fig.axes[-1].set_ylabel('[MPa]', size=20) #cbar_kws={'label': 'Celsius'}
plt.title('A', fontsize=12, color='black', loc='center', style='italic')
plt.axis('off')

plt.subplot(132)
sns.heatmap(df2, vmin=-1, vmax=1, cmap ="coolwarm", linewidths=.75 , linecolor='black', cbar=True , cbar_kws={"ticks":[-1.0,-0.75,-0.5,-0.25,0.00,0.25,0.5,0.75,1.0]})
fig.axes[-1].set_ylabel('[Mpa]', size=20) #cbar_kws={'label': 'Celsius'}
plt.title('B', fontsize=12, color='black', loc='center', style='italic')
plt.axis('off')

plt.subplot(133)
sns.heatmap(df3, vmin=-40, vmax=150, cmap ="coolwarm" , linewidths=.75 , linecolor='black', cbar=True , cbar_kws={"ticks":[-40,150,-20,0,25,50,75,100,125]}) 
plt.title('C', fontsize=12, color='black', loc='center', style='italic')
plt.axis('off')


plt.suptitle(f'Analysis of data in cycle Nr.: {count}', color='yellow', backgroundcolor='black', fontsize=48, fontweight='bold')
plt.subplots_adjust(top=0.7, bottom=0.3, left=0.05, right=0.95, hspace=0.2, wspace=0.2)
plt.savefig(f'{i}/{i}{i}{count}.png') 
plt.show()

问题是我不确定我是否可以使用它,因为它调用以下库,而我的是另一个库。如果有人向我解释是否可能以及如何在我的 sn-p 上实现它,那就太好了?

from plotly.offline import download_plotlyjs, init_notebook_mode, plot
import plotly.graph_objs as go

【问题讨论】:

    标签: python seaborn heatmap smoothing


    【解决方案1】:

    您链接的问题使用情节。如果您不想使用它并且只想平滑数据的外观,我建议您只使用使用 scipy 的高斯滤波器。

    在顶部,导入

    from scipy.ndimage.filters import gaussian_filter
    

    然后像这样使用它:

    df3_smooth = gaussian_filter(df3, sigma=1)
    sns.heatmap(df3_smooth, vmin=-40, vmax=150, cmap ="coolwarm" , cbar=True , cbar_kws={"ticks":[-40,150,-20,0,25,50,75,100,125]}) 
    

    您可以更改平滑量,例如使用sigma=3,或任何其他可以提供所需平滑量的数字。

    请记住,这也会“消除”您拥有的任何最大数据峰值,因此您的最小和最大数据将不再与您在规范化中指定的相同。为了仍然获得好看的热图,我建议不要为您的 vminvmax 使用固定值,但是:

    sns.heatmap(df3_smooth, vmin=np.min(df3_smooth), vmax=np.max(df3_smooth), cmap ="coolwarm" , cbar=True , cbar_kws={"ticks":[-40,150,-20,0,25,50,75,100,125]}) 
    

    【讨论】:

    • 您提到的第二个选项效果很好,我对您的清晰答案感到惊讶,但是我注意到最好使用sigma=1,因为在更高的sigmas sigma=2sigma=3 我失去了细节!另一个问题是我仍然在应用 super normalization 之后仍将问题分享为here,当我检查数据集中有大约 4500 个周期的归一化数据时,仍有一些数据未归一化,我想将它们包含在区间的端点。有什么想法吗?
    • 您知道,考虑到我在高斯归一化期间将数据限制在置信区间 (CI) 内,但我仍然面临一些数据超出所需规模的泄漏,但由于分布不良,我似乎需要重新调整它们和数据的积累。有什么优雅的方法可以做到这一点吗?或者我应该使用 df['A'] = scaler.fit_transform(data_to_use1.reshape(-1, 1))df['C'] = scaler.fit_transform(data_to_use1.reshape(-40, 150)) 通过使用 from sklearn import preprocessing ?如果是这样,我应该在我的脚本中的哪个位置应用来修复这个庞大数据集的规范化?
    • @Mario,您正在获取“A”/df1 规范化之外的数据,因为在第三个循环中,您正在使用 df2/“B”设置 df1 规范化的最小值和最大值'。
    • 我觉得这不是真的,如果你查看我的question 下的脚本也许我们可以讨论清楚。我相信在第三个循环中,每个df1df2df3 都由它们自己的最大值和最小值进行归一化,这些最大值和最小值是根据每个 df 在单独 高斯归一化后的正数和负数的平均值设置的 关于正值和负值。或者我没有得到你的观点。所以请在问题下提到哪一行使这种规范化失控?
    • @Mario,这适用于this question 中的代码,您在for i in df: 循环中设置min_valmax_val 。我还没有查看您其他问题中的代码。我不确定您的问题范围对于stackoverflow来说是否过于广泛。你有没有同事或顾问可以帮助你在编写代码时更有条理?
    猜你喜欢
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 2021-07-17
    相关资源
    最近更新 更多