【问题标题】:making log2 scaled heatmap in matplotlib在 matplotlib 中制作 log2 缩放热图
【发布时间】:2016-01-22 14:53:55
【问题描述】:

我想在 matplotlib 中绘制折叠变化的热图,其中颜色以 log2 比例绘制,并自定义颜色栏中显示的刻度。我尝试了以下方法:

import matplotlib.pylab as plt
import numpy as np
import matplotlib.colors
from matplotlib.colors import SymLogNorm, LogNorm

mat1 = np.clip(np.random.normal(20, 10, [20, 20]), a_min=0, a_max=500)
mat2 = np.clip(np.random.normal(10, 5, [20, 20]), a_min=0, a_max=500)
mat = np.clip(mat1 / mat2, a_min=0, a_max=500)
plt.figure()
print mat
cmap = plt.cm.get_cmap("seismic")
ticks = np.array([1/float(50), 1/float(20), 1, 20, 50])
# how to make these ticks spaced out on a log2 and not log10 scale?
plt.pcolormesh(mat, cmap=cmap, norm=SymLogNorm(linthresh=0.01, vmin=1/50., vmax=50.))
p = plt.colorbar(ticks=ticks)
plt.show()

我希望 1 的倍数变化显示为白色,因此我使用了地震颜色图。

问题:如何使颜色以 log2 比例排列,而不是 log10?并且刻度是否显示为 log2 值而不是未记录的值?

如果我尝试使用 LogNorm 而不是 SymLogNorm 那么刻度标签和我的刻度不会显示:

# This does not work -- ticks do not show
plt.pcolormesh(mat, cmap=cmap, norm=LogNorm(vmin=1/50., vmax=50.))
p = plt.colorbar(ticks=ticks)

我知道SymLogNorm 用于负数据(我没有)。我只是因为LogNorm的这个勾号问题才使用它

【问题讨论】:

  • 如果你想在你的颜色条上显示对数,为什么不直接绘制数据的对数?

标签: python matplotlib heatmap


【解决方案1】:

您可以将colorbar 对象的locator 设置为基数为2 的LogLocator。然后您需要调用p.update_ticks()

plt.pcolormesh(mat, cmap=cmap, norm=SymLogNorm(linthresh=0.01, vmin=1/50., vmax=50.))

p = plt.colorbar()
p.locator=ticker.LogLocator(base=2)
p.update_ticks()

【讨论】:

  • 那么这是否意味着 log2 单位为 1 和 log2 单位为 2 之间的颜色差异是两倍?即 2 的单位是 1 的单位的两倍? (相对于 2 的单位,红色是 1 的单位的 10 倍)
猜你喜欢
  • 2012-02-11
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
  • 2015-04-15
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
  • 2020-03-31
相关资源
最近更新 更多