在演示 lines的Datashader示例笔记本之后,输入是 Pandas DataFrame(尽管 Dask DataFrame 似乎也可以工作)。我的数据在一个 NumPy 数组中。我可以使用 Datashader 绘制来自 NumPy 数组的线条,而无需先将它们放入 DataFrame 中吗?
line glyph的文档似乎表明这是可能的,但我没有找到一个例子。我链接到的示例笔记本使用Canvas.line了我在文档中没有找到的。
我正在使用plotly的Scattermapbox将地图与由datashader的阴影函数创建的多边形的阴影图像覆盖(基于https://plotly.com/python/datashader/),但投影似乎没有对齐,请参见下图。有什么建议我可以使用plotly的Scattermapbox和datashader来克服这个问题吗?
可重现的例子:
import geopandas as gpd
import plotly.graph_objects as go
import spatialpandas as spd
import datashader as ds
from colorcet import fire
import datashader.transfer_functions as tf
# load data
world = gpd.read_file(
gpd.datasets.get_path('naturalearth_lowres')
)
# world = world.to_crs(epsg=3857)
# create spatialpandas DataFrame
df_world = spd.GeoDataFrame(world)
# create datashader canvas and aggregate
cvs = ds.Canvas(plot_width=1000, plot_height=1000)
agg = cvs.polygons(df_world, geometry='geometry', agg=ds.mean('pop_est'))
# create shaded image
tf.shade(agg, cmap=fire)
Run Code Online (Sandbox Code Playgroud)
# create shaded image and convert to Python image
img = …Run Code Online (Sandbox Code Playgroud) 是否可以将数据着色器图像添加到一组 matplotlib 子图中?
作为一个具体的例子,
import numpy as np
import pandas as pd
import matplotlib.pylab as plt
import datashader as ds
import datashader.transfer_functions as tf
from datashader.utils import export_image
from functools import partial
background = "white"
export = partial(export_image, background = background, export_path="export")
N = 10000
df = pd.DataFrame(np.random.random((N, 3)), columns = ['x','y', 'z'])
f, ax = plt.subplots(2, 2)
ax_r = ax.ravel()
ax_r[0].scatter(df['x'], df['y'], df['z'].mean())
ax_r[1].hist(df['x'])
ax_r[2].hist(df['y'])
ax_r[3].plot(df['z'])
cvs = ds.Canvas(plot_width=100, plot_height=100)
agg = cvs.points(df, 'x', 'y', ds.mean('z'))
a = export(tf.shade(agg, …Run Code Online (Sandbox Code Playgroud) 我有大约200 x 200 x 200 x 150需要在浏览器上绘制的网格。
这可以表示为Xx Yx Zx Color。3D 散布通常具有此功能。
我已经尝试过plotly.Scatter3d对于较小的数据集来说效果很好。
我看了一下,Datashader但不幸的是只适用于 2D。我也检查了Datashader+Holoviews但没有找到任何解决方案......
我越接近的是来自 PlotLy 的 MRI Slice 示例:https://plot.ly/python/visualizing-mri-volume-slices/
如果有可能添加额外的切片器(X、Y 和 Z),这可能是一个解决方案。不是我想要的,而是一个解决方案。
任何如何实现这一目标的想法将不胜感激。谢谢
我正在尝试使用 Datashader 和 Holoviews 可视化分类空间数据,类似于https://anaconda.org/jbednar/census-hv-dask/notebook。但是,当我尝试为类别分配不同的颜色时,我总是得到相同的(大概是默认的)颜色(输出图像的示例。)
这是我在 Jupyter 笔记本中运行的代码。有人可以建议我如何使自定义颜色图发挥作用吗?或者至少运行代码来查看最终的颜色是否与图例匹配。谢谢你!
from sklearn.datasets.samples_generator import make_blobs
from matplotlib import pyplot
import pandas as pd
import holoviews as hv
import geoviews as gv
import datashader as ds
from cartopy import crs
from matplotlib.cm import get_cmap
from holoviews.operation.datashader import datashade, aggregate
hv.notebook_extension('bokeh', width=95)
# Generating blob data:
X, y = make_blobs(n_samples=5000000, centers=5, n_features=2)
df = pd.DataFrame(dict(x=X[:,0], y=X[:,1], label=y))
# Plotting the blobs using datashader and holoviews:
%opts Overlay [width=800 height=455 xaxis=None yaxis=None …Run Code Online (Sandbox Code Playgroud) 我查看了datashader/Networks和PyViz/network_packets(也使用 datashader)。我想在节点选择时获得对 python 代码的回调(在节点 id 上调用函数,即fun(node_id))。如何在 PyViz/datashader 中完成此操作?
我想绘制一个包含 3 列的时间序列数据框,每条曲线一列。我希望每条曲线都有自己的颜色,并显示图例,就像hvplot()默认情况下一样。
这是一个独立的示例:
import numpy as np
import pandas as pd
import hvplot.pandas
import datetime
from holoviews.operation.datashader import datashade
n=1000
start = datetime.datetime(2010, 10, 1, 0) # Start time
datetimerange = [start + datetime.timedelta(minutes=1)*i for i in range(n)]
A = np.random.randint(5, size=n)
B = np.random.randint(20, 40, size=n)
C = np.random.randint(10, 20, size=n)
d = {'datetime': datetimerange, 'A': A, 'B': B, 'C': C}
df = pd.DataFrame(d).set_index('datetime')
df.hvplot(cmap=['red', 'blue', 'green']) + datashade(df.hvplot(cmap=['red', 'blue', 'green']))
Run Code Online (Sandbox Code Playgroud)
这是结果(左侧没有数据着色器,右侧有数据着色器):
将绘图传递给数据着色器时,颜色和图例会丢失。使用datashade=True的参数hvplot …
我使用以下步骤下载并安装了 datasheder:
git clone https://github.com/bokeh/datashader.git
cd datashader
conda install -c bokeh --file requirements.txt
python setup.py install
Run Code Online (Sandbox Code Playgroud)
之后,我使用像`python data.py 这样的终端运行代码,但没有显示图形;什么都没有显示。
我不确定我是否遵循了正确的步骤,有人可以帮我显示图表吗?这是我的代码:
import pandas as pd
import numpy as np
import xarray as xr
import datashader as ds
import datashader.glyphs
import datashader.transfer_functions as tf
from collections import OrderedDict
np.random.seed(1)
num=10000
dists = {cat: pd.DataFrame(dict(x=np.random.normal(x,s,num),
y=np.random.normal(y,s,num),
val=val,cat=cat))
for x,y,s,val,cat in
[(2,2,0.01,10,"d1"), (2,-2,0.1,20,"d2"), (-2,-2,0.5,30,"d3"), (-2,2,1.0,40,"d4"), (0,0,3,50,"d5")]}
df = pd.concat(dists,ignore_index=True)
df["cat"]=df["cat"].astype("category")
df.tail()
tf.shade(ds.Canvas().points(df,'x','y'))
glyph = ds.glyphs.Point('x', 'y')
canvas = ds.Canvas(plot_width=200, plot_height=200, x_range=(-8,8)y_range=(-8,8))
from datashader import …Run Code Online (Sandbox Code Playgroud) 我用全息视图创建了数据着色器图:
datashade(hv.Points(df[
[
'PS Engine-% Load',
'PS Engine-Fuel Rate',
]
])) + datashade(hv.Points(df[
[
'SB Engine-% Load',
'SB Engine-Fuel Rate',
]
]))
Run Code Online (Sandbox Code Playgroud)
两个图都绘制得很好,现在我想链接轴的范围,所以当我放大一个图时,另一个图也以相同的方式放大。据我所知,当源值相同时,通常轴是链接的。在这种情况下,X 轴和 Y 轴的来源不同(注意 PS 和 SB 值),但范围相同。如何链接这些轴?
我使用散景来绘制温度曲线,但在某些情况下,数据集非常大(> 500k 测量值)并且我对散景的用户体验滞后(事件与 output_backend="webgl")。所以我正在试验数据着色器以获得更快的渲染和更流畅的用户体验。
但是datashader给出的视觉效果没有bokeh的结果好看,datashader的结果有锯齿:
我通过以下代码获得了这种并排比较:
import pandas as pd
import datashader as ds
import datashader.transfer_functions as tf
from bokeh.plotting import figure
from bokeh.io import output_notebook, show
from bokeh.models import ColumnDataSource
from bokeh.layouts import row
import numpy as np
output_notebook()
# generate signal
n = 2000
start = 0
end = 70
signal = [np.sin(x) for x in np.arange(start, end, step=(end-start)/n)]
signal = pd.DataFrame(signal, columns=["signal"])
signal = signal.reset_index()
# create a bokeh plot
source = ColumnDataSource(signal)
p = figure(plot_height=300, plot_width=400, …Run Code Online (Sandbox Code Playgroud) 我的目标是在 HoloViews 中创建 x、y、z 散点图,其中使用 Datashader 生成图,通过最小化“z”来聚合点,并根据“z”对点进行着色。最终这是为了做一些事情,比如生成轮廓似然图。
我使用 HoloViews + Datashader 生成绘图取得了不错的进展,甚至以很酷的方式链接绘图(参见例如如何在 HoloViews 中使用 Datashader + Bokeh 后端进行链接数据选择),但是我无法弄清楚如何控制点颜色和聚合方法。
下面是一些代码(在 Jupyter 笔记本中运行),它们(几乎)在“普通”Datashader + Bokeh 中完成了我想要的。如何通过 HoloViews 实现相同的功能,以便我可以利用该包中的出色功能?
请特别注意,我希望将颜色分配给特定的 z 值,我不希望它被自动归一化或任何此类事情。我试图在下面的代码中通过在 'shade' 函数中设置 'span' 参数来实现这一点,尽管它不太有效,因为当我放大绘图时,我看到新的绿色区域出现,这表明颜色的绝对标准化不是保持不变的。无论如何,它应该足够接近以说明我所追求的。
import pandas as pd
from bokeh.plotting import figure, output_notebook
import datashader as ds
from datashader.bokeh_ext import InteractiveImage
from datashader import transfer_functions as tf
output_notebook(hide_banner=True)
import matplotlib.colors as colors
#Define colormap
mn=0
mx=5
s0=0./(mx-mn)
s1=1./(mx-mn)
s2=2./(mx-mn)
s3=3./(mx-mn)
s4=4./(mx-mn)
s5=5./(mx-mn)
cdict = {
'red' : ((s0, 0., …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用全息视图、数据着色器和散景将谷歌手机历史位置映射到地图上。大多数情况下与 datashader 网站中给出的示例非常相似。但是当我做地图覆盖时,因为纬度/经度被弄乱了,所以地图覆盖不起作用。
import datashader as ds
import geoviews as gv
import holoviews as hv
from holoviews.operation.datashader import datashade, dynspread
from datashader import transfer_functions as tf
from colorcet import fire
hv.extension('bokeh')
> df2.head()
lat long
0 -37.7997515 144.9636466
1 -37.7997515 144.9636466
2 -37.7997369 144.9636036
3 -37.7997387 144.9636358
4 -37.7997515 144.9636466
Run Code Online (Sandbox Code Playgroud)
这可以生成数据的图像,
ds_viz = ds.Canvas().points(df2,'lat','long')
tf.set_background(tf.shade(ds_viz, cmap=fire),"black")
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试用地图覆盖它时,它不起作用,
从 bokeh.models 导入 WMTSTileSource
url = 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{Z}/{Y}/{X}.jpg'
tile_opts = dict(width=1000,height=600,bgcolor='black',show_grid=False)
map_tiles = gv.WMTS(url).opts(style=dict(alpha=0.5), plot=tile_opts)
points = hv.Points(df2, kdims=['long','lat'])
trips = datashade(points, cmap=fire,width=1000, height=600) …Run Code Online (Sandbox Code Playgroud) 最初,我创建了英国邮政编码区域的交互式地图,其中单个区域根据其值(例如该邮政编码区域中的人口)用颜色表示,如下所示。
from bokeh.plotting import figure
from bokeh.palettes import Viridis256 as palette
from bokeh.models import LinearColorMapper
from bokeh.models import ColumnDataSource
import geopandas as gpd
shp = 'file_path_to_the_downloaded_shapefile'
#read shape file into dataframe using geopandas
df = gpd.read_file(shp)
def expandMultiPolygons(row, geometry):
if row[geometry].type = 'MultiPolygon':
row[geometry] = [p for p in row[geometry]]
return row
#Some rows were in MultiPolygons instead of Polygons.
#Expand MultiPolygons to multi rows of Polygons
df = df.apply(expandMultiPolygons, geometry='geometry', axis=1)
df = df.set_index('Area')['geometry'].apply(pd.Series).stack().reset_index()
#Visualize the polygons. To visualize …Run Code Online (Sandbox Code Playgroud) datashader ×13
python ×10
holoviews ×5
bokeh ×4
plotly ×2
callback ×1
colormap ×1
dataframe ×1
geoviews ×1
graph ×1
mapbox ×1
matplotlib ×1
numpy ×1
pandas ×1
plot ×1
projection ×1
python-2.7 ×1
python-3.x ×1
pyviz ×1