调整holoviews散景中的颜色图以匹配值的分布

时间:2018-07-09 14:32:18

标签: colors bokeh color-mapping holoviews

我使用以下选项在具有bokeh扩展名的jupyter笔记本中的Holoviews中创建了地图:

%output size=150
%opts Overlay [show_legend=True, width=800 height=400]
%opts Points.Data [color_index='b' size_index='a' scaling_factor=10 colorbar=True](cmap='RdYlGn' size=3)

'b'和'a'都是介于-1和1之间的变量。

这会产生两个问题(也比较图片):

  1. 根据变量'a'的绝对值确定点的大小。但是,我希望值产生的值越小(越大),负值(正)越多。有什么解决办法(除了在绘制之前将“ a”缩放到正范围外)?
  2. 由于'b'的正值明显大于负值,因此几乎所有的点都映射为绿色,而很少使用颜色范围的负值。我不想转换“ b”,因为它的值具有含义,我希望在颜色图例中显示该值。有什么建议如何调整颜色图以更好地反映“ b”值的分布?

我是holoviews / bokeh的新手,还不习惯语法。因此,我也很感谢示例代码。

enter image description here

2 个答案:

答案 0 :(得分:0)

第一个问题的答案非常简单,Points支持size_fn选项,在绘制一些简单的东西(如将点偏移1)之前,可以使用该选项来转换大小值。第二个问题比较棘手,没有简单的答案。如果在0以下的点很少,我会考虑是否使用分散的颜色图是正确的选择。也许只是将颜色尺寸范围设置为0-1,使用标准的颜色图,并为超出该范围的值设置特殊的颜色。

# Make some fake data
lon, lat = np.random.rand(2, 100)*180-90
a = np.clip((np.random.randn(100) + 1)/2., -1, 1)
b = np.clip((np.random.randn(100) + 1)/2., -1, 1)
df = pd.DataFrame({'lon': lon, 'lat': lat, 'a': a, 'b': b})

gv.tile_sources.EsriImagery * gv.Points(df, ['lon', 'lat']).options(
    width=600, height=400, color_index='a', size_fn=lambda x: x+1, 
    scaling_factor=20, size_index='b', colorbar=True, cmap='Greens', 
    clipping_colors={'min': "red"}
).redim.range(a=(0, 1))

enter image description here

在上面的示例中,我使用size_fn将颜色值偏移了一个,因此它们都是正数并且可以缩放。其次,我使用.redim.range方法将颜色值的范围设置为0-1。最后,我用clipping_colors说,任何低于最小值(0的值)的颜色都应涂成红色。

答案 1 :(得分:0)

要回答#2,您可以使用默认的颜色图制作自己的颜色图,并像这样从颜色图的末端删除许多颜色(更改开始/停止位置)

select convert(char(5), val1 * power(10, 5-len(val1)) + val2)
from (VALUES(3, 22), (33, 22), (33, 222)) v(val1, val2)

然后执行from matplotlib.colors import LinearSegmentedColormap import matplotlib.pyplot as plt cmap_name = 'RdBu_r' start = 0.4 stop = 1 n = 256 cmap = plt.get_cmap(cmap_name) colors = cmap(np.linspace(start, stop, cmap.N)) new_cmap = LinearSegmentedColormap.from_list('mycmap', colors=colors, N=n)

作为一个例子,下面,我从RdBu_r中切出所有的蓝色,只剩下红色 https://holoext.readthedocs.io/en/latest/examples/changing_colorbar_cmap.html#Colorbar-string-shortcut