在Python中使小值在matplotlib色条上可见
我在用默认的“jet”颜色条和“hexbin”一起使用。我的数据分布在一些小块里,数量从0到大约1500不等。问题是,有些六边形的小块的数量在1到10之间,而有些小块的数量则有几百。这就导致在jet颜色条中,0到10这个范围的颜色和0的颜色是一样的,也就是说,看不出来有什么区别。我希望这些小的值能够被看得见。请问我该怎么做才能让颜色条显示出:确保那些大于或等于某个值N的小块有一个“可见”的颜色,也就是和0的小块的颜色不一样?
谢谢。
2 个回答
另外,还有一个叫做 mincnt
的选项,可以用来设置 hexbin 中的最小计数。也就是说,如果某个区域的计数少于这个数字,就会把它留空。这种做法可以让我们在使用 jet 颜色方案时,更容易区分计数为零和计数为一的情况。
hexbin( ...., mincnt=1)
一个简单的解决办法是尝试在六边形图上绘制 log(counts)
而不是直接绘制 counts。这会让图表的比例更合理,高的计数值会被压缩,而低的计数值则不会。不过,你需要在某个地方说明你展示的值是 log(counts)
而不是 counts
,否则随便看图的人可能会误解这个图。
一个更好的方法可能是修改你使用的颜色映射。内置的颜色映射通常是从 '0' 颜色到 '1' 颜色线性变化的。为了让低值的颜色变化更明显,而高值的颜色变化不那么明显,你需要使用非线性的颜色映射。
要做到这一点,你可以尝试 matplotlib.colors
,特别是 matplotlib.colors.LinearSegmentedColormap.from_list
(http://matplotlib.sourceforge.net/api/colors_api.html#matplotlib.colors.LinearSegmentedColormap.from_list)
基本上,你需要输入 '0' 和 '1' 的颜色(比如蓝色到红色),还有一个伽马值。伽马值大于 1.0 会让低值部分的变化更敏感。
如果你还没尝试过,可以试试类似这样的代码:
import matplotlib.colors as colors
# colourmap from green to red, biased towards the blue end.
# Try out different gammas > 1.0
cmap = colors.LinearSegmentedColormap.from_list('nameofcolormap',['g','r'],gamma=2.0)
# feed cmap into hexbin
hexbin( ...., cmap=cmap )