我使用以下选项在具有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之间的变量。
这会产生两个问题(也比较图片):
我是holoviews / bokeh的新手,还不习惯语法。因此,我也很感谢示例代码。
答案 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))
在上面的示例中,我使用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