我正试图用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()
它给出:
以及第二个ascii光栅,用于描绘流经景观的河流的特性。此数据可以用与上面相同的方式绘制,但是数组中与河网不对应的值被指定为-9999的“无数据”值。其目的是将“无数据”值设置为透明,以便河流值覆盖山体阴影。
这是河流数据,理想情况下这里表示为0的每个像素都是完全透明的。
在这方面做了一些研究之后,我似乎可以将我的数据转换成一个RGBA数组,并设置alpha值以使不需要的单元格透明。但是,river数组中的值是浮点数,无法转换(因为原始值是图形的整点),而且我相信如果使用RGBA格式,imshow
函数只能接受无符号整数。
有办法绕过这个限制吗?我本来希望我可以简单地创建一个像素值和alpha值的元组,然后像那样绘制它们,但这似乎是不可能的。
我还尝试用PIL
创建一个没有透明数据值的河流数据的PNG文件,但是这似乎会自动将像素值缩放到0-255,从而丢失需要保留的值。
我欢迎任何人对这个问题有任何见解。
不使用屏蔽数组的另一种方法是设置颜色映射如何处理小于最小值
clim
的剪裁值(无耻地使用Joe Kington的示例):还有一个
set_over
用于剪切顶部,还有一个set_bad
用于设置颜色映射如何处理数据中的“坏”值。这样做的一个优点是,只需使用
im.set_clim([bot, top])
调整clim
,就可以更改阈值只要mask你的“river”数组。
例如
作为以这种方式覆盖两个图的快速示例:
另外,顺便说一下,
imshow
很乐意接受RGBA格式的float。它只希望所有内容都在0到1之间。相关问题 更多 >
编程相关推荐