首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Matplotlib中基于像素值设置透明度

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

Stack Overflow用户
提问于 2013-06-18 21:31:22
回答 3查看 22.3K关注 0票数 29

我正在尝试使用matplotlib为我正在撰写的一篇论文绘制一些图形。我有两组二维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()

这就给出了:

以及第二ascii栅格,其描绘流经该景观的河流的属性。可以以与上述相同的方式绘制该数据,但是,将不对应于河网的数组中的值指定为-9999的无数据值。其目的是将no数据值设置为透明,以便河流值覆盖在山体阴影上。

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

在这方面做了一些研究之后,我似乎可以将我的数据转换为RGBA数组,并将alpha值设置为只使不需要的单元格透明。但是,河数组中的值是浮点数,不能转换(因为原始值是图中的全部内容),我相信如果使用RGBA格式,imshow函数只能接受无符号整数。

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-18 21:46:58

只需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()

此外,顺便说一句,imshow将很乐意接受其RGBA格式的浮点数。它只是希望所有内容都在0到1的范围内。

票数 49
EN

Stack Overflow用户

发布于 2013-06-19 05:04:49

在不使用掩码数组的情况下,另一种方法是设置颜色映射如何处理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()

还有一个用于裁剪顶部的set_over和一个用于设置色彩映射表如何处理数据中“坏”值的set_bad

这样做的一个好处是,您可以通过使用im.set_clim([bot, top])调整clim来更改阈值

票数 18
EN

Stack Overflow用户

发布于 2021-02-09 01:18:42

另一种选择是设置所有对np.nan透明的单元格(不确定哪个更有效,我猜基于climtacaswell's answer将是最好的)。采用Joe Kington's answer的示例

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.where(masked_data < 0.9)] = np.nan

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

请注意,对于dtype=bool数组,您不应该为了PEP8 (E712)而遵循您的集成开发环境的建议来比较masked_data is True,而是坚持使用masked_data == True进行逐个元素的比较,否则屏蔽将失败:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17170229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档