具有对数刻度色条的Seaborn热图

时间:2016-04-27 18:27:04

标签: pandas seaborn

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

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

谢谢。

4 个答案:

答案 0 :(得分:14)

是的,但是seaborn已经为色条硬编码了一个线性刻度定位器,所以结果可能不是你想要的:

# http://matplotlib.org/examples/pylab_examples/pcolor_log.html
# modified to use seaborn

import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
import numpy as np
from matplotlib.mlab import bivariate_normal
import seaborn as sns; sns.set()


N = 20
X, Y = np.mgrid[-3:3:complex(0, N), -2:2:complex(0, N)]

# A low hump with a spike coming out of the top right.
# Needs to have z/colour axis on a log scale so we see both hump and spike.
# linear scale only shows the spike.
Z1 = bivariate_normal(X, Y, 0.1, 0.2, 1.0, 1.0) + 0.1 * bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)

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

sns.heatmap(Z1, ax = axs[0])
sns.heatmap(Z1, ax = axs[1],
            #cbar_kws={'ticks':[2,3]}, #Can't specify because seaborn does
            norm=LogNorm(vmin=Z1.min(), vmax=Z1.max()))


axs[0].set_title('Linear norm colorbar, seaborn')
axs[1].set_title('Log norm colorbar, seaborn')
plt.show()

请参阅pylab示例,该示例以pylab版本开头,自动获取colorbar tick标签(尽管不是很漂亮)。

spiky data with linear and log colorbar

您可以编辑seaborn代码使其正常工作:如果您更改/seaborn/matrix.py(ver 0.7.0)中的plot()函数:

    # Possibly add a colorbar
    if self.cbar:
        ticker = mpl.ticker.MaxNLocator(6)
        if 'norm' in kws.keys():
            if type(kws['norm']) is mpl.colors.LogNorm:
                ticker = mpl.ticker.LogLocator(numticks=8)

你得到:

enter image description here

我会建议在seaborn github上,但如果你想早点,那就是。

答案 1 :(得分:11)

简短答案:

from matplotlib.colors import LogNorm

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

答案 2 :(得分:7)

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

{     
      "id": "10",
      "selected": true
}

heatmap rand

答案 3 :(得分:0)

回应cphlewis(我没有足够的声誉),我使用cbar_kws={"ticks":[0,1,10,1e2,1e3,1e4,1e5]}解决了这个问题;正如我在这里看到的那样:seaborn clustermap: set colorbar ticks

例如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()

for (int y = 0; y < N; ++y)    // Can be parallelized
{
    for (int x = 0; x < N - 1; ++x)
    {
        if(Matrix(x, y) != Matrix(x + 1, y))
            RowWiseDiscontinuity[y].push_back(x);
    }
}

度过愉快的一天。