【问题标题】:Seaborn Heatmap with logarithmic-scale colorbar带有对数刻度颜色条的 Seaborn 热图
【发布时间】:2016-04-27 18:27:03
【问题描述】:

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

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

谢谢。

【问题讨论】:

    标签: python pandas seaborn colorbar


    【解决方案1】:

    如果您当前安装了 seaborn,则调用 heatmap 中的 norm=LogNorm() 现在可以使用。 (在 cmets 中指出——谢谢。)将此添加到其中一个 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())
    

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

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

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

    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 中不起作用,请参阅此答案的先前版本以获取解决方法。

    【讨论】:

    • seaborn issue github.com/mwaskom/seaborn/issues/459 也可以修复(不同的方式)
    • 唯一的问题是,如果您的某些值是负数,那就有问题了。双曲反正弦 (arcsinh) 对负值和 0 值效果更好。
    • matplotlib 没有内置 arcsinh,但您可以将 SymLogNorm 用于负值。不确定它是否处理 0。 matplotlib.org/devdocs/tutorials/colors/…
    • 有没有办法在sns.jointplot完成的二维直方图中启用对数色标?
    • 我只是想补充一点,硬编码刻度定位器的问题似乎已在最新版本的 seaborn 中得到修复。我唯一要做的就是指定norm=LogNorm(),这也会导致对数刻度。
    【解决方案2】:

    简答:

    from matplotlib.colors import LogNorm
    
    sns.heatmap(df, norm=LogNorm())
    

    【讨论】:

      【解决方案3】:

      您可以使用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}
      )
      

      【讨论】:

      • 有没有办法将颜色条上刻度值的格式更改为实际数字(如示例中的 0.01 和 0.1)而不是表示为幂(10^-2, 10 ^-1) 等等?
      【解决方案4】:

      响应 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()
      

      祝你有美好的一天。

      【讨论】:

      • LogNorm 来自哪里?此外,sns.heatmap 的热图没有显示 norm:它有什么作用?
      猜你喜欢
      • 2015-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      • 1970-01-01
      • 2018-05-07
      • 1970-01-01
      相关资源
      最近更新 更多