如何在数据着色器中设置正确的彩色图像颜色?

How can I set up the correct color image color in datashader?

我试图从数据着色器页面绘制一个关于 Timeseries. I used all the code snippets including this paragraph 的给定示例,并尝试通过将 img 传递给 plt.imshow(img) 来使用 matplotlib 绘制 img :

import datetime
import pandas as pd
import numpy as np
import xarray as xr
import datashader as ds
import datashader.transfer_functions as tf
from collections import OrderedDict

import matplotlib.pyplot as plt
...

cvs = ds.Canvas(x_range=x_range, y_range=y_range, plot_height=300, plot_width=900)
aggs= OrderedDict((c, cvs.line(df, 'ITime', c)) for c in cols)
img = tf.shade(aggs['a'])

plt.imshow(img)
plt.show()
plt.close()

我想,它会渲染一个图像,如图所示,具有白色背景和蓝色图形。然而,结果看起来像这样:

此外,我还尝试了以下几行,但无法创建数据着色器页面上显示的示例图像:


colors = ["red", "grey", "black", "purple", "pink",
          "yellow", "brown", "green", "orange", "blue"]
imgs = [tf.shade(aggs[i], cmap=[c]) for i, c in zip(cols, colors)]
tf.stack(*imgs)

如何正确设置图像的颜色以便打印、保存或使用它?

它在数据着色器示例中是如何工作的?

How can I correctly setup the color of my image in order to plot, save or work with it?

简单的答案是,如果您想使用 imshow 在 Matplotlib 中绘制 tf.shade 的输出,您可以使用 [=] 将其转换为 imshow 理解的 PIL 图像13=]:

如果你不那样转换成PIL,tf.shade()的输出是一个datashader.transfer_functions.Image类型的对象,一种Xarray DataArray类型,它堆叠了R,G,B,和图像的通道作为多维数组。 imshow 可以显示 RGBA 图像,但不能显示 Datashader 返回的堆叠 DataArray 格式,因此它似乎只采用一个通道(R,也许?)并使用默认的 Matplotlib 颜色图绘制,因此颜色不同.所以永远不要将 tf.shade 的输出直接传递给 imshow;这永远不会有用,而且它绘制任何东西有点不幸,因为它太具有误导性了。

可以安全地将底层二维聚合数组(cvs.line的输出)传递给imshow供Matplotlib进行色彩映射和显示,但是(a) 如果您不喜欢 Matplotlib 的默认 Viridis,您将想要选择自己的颜色图,并且 (b) 当 Datashader 渲染到从左下角开始的坐标而 Matplotlib 从左上角开始时,输出将垂直翻转:

但是,如果您想要 Matplotlib 图,我建议您使用 Datashader's native Matplotlib dsshow plotting support 将结果显示为 Matplotlib 图,而不是这些选项中的任何一个;无需像这样处理任何中间步骤,作为奖励,结果将是交互式的。

How did it work in the datashader example?

Datashader 文档都是作为 Jupyter 笔记本编写的,在这些示例中,笔记本是处理图像显示的工具,使用 Jupyter/IPython 的 rich display support. Specifically, a datashader Image object implements _repr_html_(), and Jupyter/IPython calls that method to display the object in the notebook. You can instead call img.to_pil() yourself if you want something easily converted to PNG as described in the PIL 文档。