python - 在 Matplotlib 中根据像素值设置透明度

标签 python matplotlib python-imaging-library

我正在尝试使用 matplotlib 为我正在处理的论文绘制一些数字。我在 2D numpy 数组中有两组数据:一个 ascii 山体阴影栅格,我可以很高兴地使用它来绘制和调整:

import matplotlib.pyplot as pp
import numpy as np

hillshade = np.genfromtxt('hs.asc', delimiter=' ', skip_header=6)[:,:-1]

pp.imshow(hillshade, vmin=0, vmax=255)
pp.gray()
pp.show()

这给出了:

Hillshade

还有第二个 ascii 栅格,它描绘了流经景观的河流的特性。可以以与上述相同的方式绘制此数据,但是数组中与河网不对应的值被指定为 -9999 的无数据值。目的是将无数据值设置为透明,以便河流值覆盖山体阴影。

这是河流数据,理想情况下这里表示为 0 的每个像素都是完全透明的。

River data

已经对此进行了一些研究,似乎我可以将我的数据转换为 RGBA 数组并设置 alpha 值以仅使不需要的单元格透明。但是,河流数组中的值是 float ,无法转换(因为原始值是图中的全部点),我相信 imshow 函数如果使用 RGBA 格式只能采用无符号整数.

有没有办法绕过这个限制?我曾希望我可以简单地创建一个包含像素值和 alpha 值的元组并像这样绘制它们,但这似乎是不可能的。

我也玩过 PIL 尝试创建一个没有数据值透明的河流数据的 PNG 文件,但这似乎会自动将像素值缩放到 0-255,从而失去了我需要保留的值(value)。

我欢迎任何人对此问题有任何见解。

最佳答案

只需 mask你的“河流”数组。

例如

rivers = np.ma.masked_where(rivers == 0, rivers)

作为以这种方式叠加两个图的快速示例:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

# Generate some data...
gray_data = np.arange(10000).reshape(100, 100)

masked_data = np.random.random((100,100))
masked_data = np.ma.masked_where(masked_data < 0.9, masked_data)

# Overlay the two images
fig, ax = plt.subplots()
ax.imshow(gray_data, cmap=cm.gray)
ax.imshow(masked_data, cmap=cm.jet, interpolation='none')
plt.show()

enter image description here

另外,附带说明一下,imshow 很乐意接受其 RGBA 格式的 float 。它只是期望一切都在 0 到 1 之间。

关于python - 在 Matplotlib 中根据像素值设置透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17170229/

相关文章:

python - 进口抱枕无需安装

python - Python OpenCV : Mutithreading with opecv video streaming

php - 什么是 PHP 的 var_dump() 的 Python 等价物?

python - 将 JSON 文件直接转储到远程 SSH 连接中,而不先将它们存储在本地计算机中

python - 是否可以更改 imshow matplotlib 可视化的宽度?

python - 为什么 PIL 缩略图不能正确调整大小?

python - 在 Python pandas 中使用正则表达式查找组合数字和字母的特定字符序列

python - 如何在我的训练数据集中定义此列?

python - 如何使用虚构日期解决 "ValueError: day is out of range for month"问题?

python - 尝试将灰度图像中的所有白色区域变成黑色