基于Matplotlib中像素值设置透明度

2024-05-17 03:43:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图用matplotlib为我正在写的论文绘制一些图形。我在2D numpy数组中有两组数据:一个ascii hillshade光栅,我可以很高兴地使用它绘制和调整:

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值以使不需要的单元格透明。但是,river数组中的值是浮点数,无法转换(因为原始值是图形的整点),而且我相信如果使用RGBA格式,imshow函数只能接受无符号整数。

有办法绕过这个限制吗?我本来希望我可以简单地创建一个像素值和alpha值的元组,然后像那样绘制它们,但这似乎是不可能的。

我还尝试用PIL创建一个没有透明数据值的河流数据的PNG文件,但是这似乎会自动将像素值缩放到0-255,从而丢失需要保留的值。

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


Tags: 数据importnumpy图形matplotlibas光栅np
2条回答

不使用屏蔽数组的另一种方法是设置颜色映射如何处理小于最小值clim的剪裁值(无耻地使用Joe Kington的示例):

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))

my_cmap = cm.jet
my_cmap.set_under('k', alpha=0)


# Overlay the two images
fig, ax = plt.subplots()
ax.imshow(gray_data, cmap=cm.gray)
im = ax.imshow(masked_data, cmap=my_cmap, 
          interpolation='none', 
          clim=[0.9, 1])
plt.show()

example

还有一个set_over用于剪切顶部,还有一个set_bad用于设置颜色映射如何处理数据中的“坏”值。

这样做的一个优点是,只需使用im.set_clim([bot, top])调整clim,就可以更改阈值

只要mask你的“river”数组。

例如

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之间。

相关问题 更多 >