如何在holoviews中更改地图中点的大小?

时间:2018-07-16 03:54:04

标签: python ipython holoviews geoviews

这是我的代码:

import holoviews as hv
import datashader as ds
import dask.dataframe as dd
import geoviews as gv
from cartopy import crs

from holoviews.operation.datashader import datashade

hv.extension('bokeh', width=95)

%opts RGB     [width=1200 height=682 xaxis=None yaxis=None show_grid=False bgcolor='black'] 
%opts Shape (fill_alpha=0 line_width=1.5) [apply_ranges=False tools=['tap']] 
%opts Points [apply_ranges=False ] WMTS (alpha=0.5)


color_key = {worda:'red',  wordb:'green'}
races     = {worda:worda, wordb:wordb}


color_points = hv.NdOverlay({races[k]: gv.Points([0,0], crs=crs.PlateCarree())(style=dict(color=v))
                             for k, v in color_key.items()})

census_points = hv.Points(df, kdims=['x', 'y'], vdims=['word'])

x_range, y_range = ((-13884029.0, -7453303.5), (2818291.5, 6335972.0)) # Continental USA

shade_defaults = dict(x_range=x_range, y_range=y_range, x_sampling=10, y_sampling=10, width=1200, height=682,
                      color_key=color_key, aggregator=ds.count_cat('word'),)
shaded = datashade(census_points, **shade_defaults)
shaded()

,结果看起来像: enter image description here 但我想要更大的点数,像这样: enter image description here

如何为目标更改代码? 谢谢!

2 个答案:

答案 0 :(得分:0)

(从并行的Github问题https://github.com/ioam/holoviews/issues/2877#issuecomment-405158027复制。)

到目前为止,数据着色器仅包含无限小的点和无限的细线,如果不是图像中像素的非零宽度,则它们将不可见。我们计划最终要添加点或线具有范围的功能,但是目前,您有两种选择:

  1. 降低图像的分辨率,使每个孤立的像素更清晰可见。
  2. 添加“从holoviews.operation.datashader导入dynspread”(或“ spread”),然后使用扩展将每个像素扩展到相邻像素。从数学上讲,这与具有非零范围不同,但是当点相距较远时(如上面的大多数点),它的近似值才有效。两者都有可以更改的参数,以选择要制作点的大小。

答案 1 :(得分:0)

正如James A. Bednar回答的那样,使用 dynspread()可以使数据阴影散点图中的点变大。
您的代码应如下所示:

from holoviews.operation.datashader import datashade, dynspread

dynspread(datashade(your_holoviews_scatterplot))

这可确保数据阴影散点图中的点在屏幕上占据更多像素。

dynspread()具有一些影响标记大小的参数,另请参见:
Documentation on dynspread()

例如,您可以更改阈值参数以获得更大的标记,尽管它不会使绘图更漂亮。阈值可以保存0到1之间的值。阈值是一个调整参数,值越大,散布越多。

dynspread(datashade(your_holoviews_scatterplot), threshold=1.0)