# 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()
# 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)
#!/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}
)
是的,但是seaborn已经为colorbar硬编码了一个线性tick定位器,所以结果可能不是您想要的那样:
请参阅pylab示例,该示例从一个pylab版本开始,该版本会自动获取colorbar tick标签(尽管在其他方面不是很漂亮)。
您可以编辑seaborn代码使其工作:如果更改/seaborn/matrix.py(0.7.0版)中的
plot()
函数:你得到:
我建议你在seaborn github上买,但如果你想早点买的话,就买吧。
响应cphlewis(我没有足够的声誉),我使用
cbar_kws
;解决了这个问题,正如我在这里看到的:seaborn clustermap: set colorbar ticks。例如
cbar_kws={"ticks":[0,1,10,1e2,1e3,1e4,1e5]}
。祝你今天愉快。
可以使用matplotlib.colors.LogNorm规范化colorbar上的值。 我还不得不在seaborn中手动设置标签,最后得到了以下代码:
相关问题 更多 >
编程相关推荐