在Python中使小值在matplotlib色条上可见

2 投票
2 回答
3002 浏览
提问于 2025-04-17 08:08

我在用默认的“jet”颜色条和“hexbin”一起使用。我的数据分布在一些小块里,数量从0到大约1500不等。问题是,有些六边形的小块的数量在1到10之间,而有些小块的数量则有几百。这就导致在jet颜色条中,0到10这个范围的颜色和0的颜色是一样的,也就是说,看不出来有什么区别。我希望这些小的值能够被看得见。请问我该怎么做才能让颜色条显示出:确保那些大于或等于某个值N的小块有一个“可见”的颜色,也就是和0的小块的颜色不一样?

谢谢。

2 个回答

0

另外,还有一个叫做 mincnt 的选项,可以用来设置 hexbin 中的最小计数。也就是说,如果某个区域的计数少于这个数字,就会把它留空。这种做法可以让我们在使用 jet 颜色方案时,更容易区分计数为零和计数为一的情况。

hexbin( ...., mincnt=1)
3

一个简单的解决办法是尝试在六边形图上绘制 log(counts) 而不是直接绘制 counts。这会让图表的比例更合理,高的计数值会被压缩,而低的计数值则不会。不过,你需要在某个地方说明你展示的值是 log(counts) 而不是 counts,否则随便看图的人可能会误解这个图。

一个更好的方法可能是修改你使用的颜色映射。内置的颜色映射通常是从 '0' 颜色到 '1' 颜色线性变化的。为了让低值的颜色变化更明显,而高值的颜色变化不那么明显,你需要使用非线性的颜色映射。

要做到这一点,你可以尝试 matplotlib.colors,特别是 matplotlib.colors.LinearSegmentedColormap.from_listhttp://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 )

撰写回答