0

我试图从有关Timeseries的数据着色器页面中绘制一个给定的示例。我使用了包括本段在内的所有代码片段,并尝试通过将 传递给imgmatplotlib来绘制:imgplt.imshow(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)

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

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

4

1 回答 1

1

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

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

imshow img.to_pil

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

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

显示输出

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

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

Datashader 文档都是作为 Jupyter 笔记本编写的,在这些示例中,使用 Jupyter/IPython丰富的显示支持来处理图像显示。具体来说,datashaderImage对象实现了_repr_html_(),并且 Jupyter/IPython 调用该方法在笔记本中显示该对象。img.to_pil()如果您希望按照PIL文档中的说明轻松转换为 PNG,您可以打电话给自己。

于 2022-01-18T22:59:16.340 回答