繁体   English   中英

带有对数刻度颜色条的 Seaborn 热图

[英]Seaborn Heatmap with logarithmic-scale colorbar

有没有办法设置颜色条比例以登录seaborn热图?
我正在使用 Pandas 的数据透视表输出作为调用的输入

 sns.heatmap(df_pivot_mirror,annot=False,xticklabels=256,yticklabels=128,cmap=plt.cm.YlOrRd_r)

谢谢。

如果你有一个当前seaborn,上安装norm=LogNorm()的调用heatmap现在的作品。 (在评论中指出——谢谢。)将其添加到其中一个 seaborn 示例中:

import numpy as np
import seaborn as sns; sns.set_theme(style='white')
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm, Normalize
from matplotlib.ticker import MaxNLocator

flights = sns.load_dataset("flights")
flights = flights.pivot("month", "year", "passengers")


f3, ax5 = plt.subplots(1,1)
sns.heatmap(flights, square=True, norm=LogNorm())

带有对数范数颜色条的热图,四个刻度标签

您可以将 colorbar 参数作为seaborn包装器中的关键字传递,但它们有时会与 seaborn 选择发生冲突:

sns.heatmap(flights, square=True, norm=LogNorm(), cbar_kws={'ticks':MaxNLocator(2), 'format':'%.e'})

带有对数范数颜色条的热图,四个带有不一致数字格式的刻度标签

为了进行比较,这是没有 seaborn 改进的matplotlib热图——颜色条参数都已应用:

f5, ax6 = plt.subplots(1,1)
im6 = plt.imshow(flights, norm=LogNorm())
cbar6 = ax.figure.colorbar(im6, ax=ax6, ticks=MaxNLocator(2), format='%.e')

带有对数范数颜色条、两个刻度标签、科学数字格式的热图

如果您必须使用较旧的安装并且LogNorm在 seaborn 中不起作用,请参阅此答案的先前版本以获取解决方法。

简答:

from matplotlib.colors import LogNorm

sns.heatmap(df, norm=LogNorm())

您可以使用matplotlib.colors.LogNorm对颜色条上的值进行标准化。 我还必须在 seaborn 中手动设置标签,最终得到以下代码:

#!/usr/bin/env python3

import math

import numpy as np
import seaborn as sn
from matplotlib.colors import LogNorm

data = np.random.rand(20, 20)

log_norm = LogNorm(vmin=data.min().min(), vmax=data.max().max())
cbar_ticks = [math.pow(10, i) for i in range(math.floor(math.log10(data.min().min())), 1+math.ceil(math.log10(data.max().max())))]

sn.heatmap(
    data,
    norm=log_norm,
    cbar_kws={"ticks": cbar_ticks}
)

热图兰特

响应 cphlewis(我没有足够的声誉),我使用cbar_kws解决了这个问题; 正如我在这里看到的: seaborn clustermap: set colorbar ticks

例如cbar_kws={"ticks":[0,1,10,1e2,1e3,1e4,1e5]}

from matplotlib.colors import LogNorm
s=np.random.rand(20,20)
sns.heatmap(s, norm=LogNorm(s.min(),s.max()),
            cbar_kws={"ticks":[0,1,10,1e2,1e3,1e4,1e5]},
            vmin = 0.001, vmax=10000)
plt.show()

有一个美好的一天。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM