我想在matplotlib/pyplot中的图像文件上绘制一个透明的等值线图。
这是我目前得到的。
我有一个600 x600像素的正方形图像文件test.png
,看起来像这样:
我想用matplotlib和pyplot在这个图像上绘制一个等值线图(让图像文件在“下面”,并覆盖一个半透明版本的等值线图)。作为一个额外的好处,图像会自动缩放以适应当前的绘制边界。我的示例绘制脚本如下:
from matplotlib import pyplot
from matplotlib.ticker import MultipleLocator, FormatStrFormatter
from matplotlib.colors import BoundaryNorm
from matplotlib.ticker import MaxNLocator
from pylab import *
import numpy as np
import random
# ----------------------------- #
dx, dy = 500.0, 500.0
y, x = np.mgrid[slice(-2500.0, 2500.0 + dy, dy),slice(-2500.0, 2500.0 + dx, dx)]
z = []
for i in x:
z.append([])
for j in y:
z[-1].append(random.uniform(80.0,100.0))
# ----------------------------- #
plot_aspect = 1.2
plot_height = 10.0
plot_width = int(plot_height*plot_aspect)
# ----------------------------- #
pyplot.figure(figsize=(plot_width, plot_height), dpi=100)
pyplot.subplots_adjust(left=0.10, right=1.00, top=0.90, bottom=0.06, hspace=0.30)
subplot1 = pyplot.subplot(111)
# ----------------------------- #
cbar_max = 100.0
cbar_min = 80.0
cbar_step = 1.0
cbar_num_colors = 200
cbar_num_format = "%d"
# ----------
levels = MaxNLocator(nbins=cbar_num_colors).tick_values(cbar_min, cbar_max)
cmap = pyplot.get_cmap('jet')
norm = BoundaryNorm(levels, ncolors=cmap.N, clip=True)
pp = pyplot.contourf(x,y,z,levels=levels,cmap=cmap)
cbar = pyplot.colorbar(pp, orientation='vertical', ticks=np.arange(cbar_min, cbar_max+cbar_step, cbar_step), format=cbar_num_format)
cbar.ax.set_ylabel('Color Scale [unit]', fontsize = 16, weight="bold")
# ----------
CS = pyplot.contour(x,y,z, alpha=0.5)
# ----------
majorLocator1 = MultipleLocator(500)
majorFormatter1 = FormatStrFormatter('%d')
minorLocator1 = MultipleLocator(250)
subplot1.xaxis.set_major_locator(majorLocator1)
subplot1.xaxis.set_major_formatter(majorFormatter1)
subplot1.xaxis.set_minor_locator(minorLocator1)
pyplot.xticks(fontsize = 16)
pyplot.xlim(-2500.0,2500.0)
# ----------
majorLocator2 = MultipleLocator(500)
majorFormatter2 = FormatStrFormatter('%d')
minorLocator2 = MultipleLocator(250)
subplot1.yaxis.set_major_locator(majorLocator2)
subplot1.yaxis.set_major_formatter(majorFormatter2)
subplot1.yaxis.set_minor_locator(minorLocator2)
pyplot.yticks(fontsize = 16)
pyplot.ylim(-2500.0,2500.0)
# ----------
subplot1.xaxis.grid()
subplot1.yaxis.grid()
# ----------
subplot1.axes.set_aspect('equal')
# ----------
pyplot.suptitle('Main Title', fontsize = 24, weight="bold")
# ----------
pyplot.xlabel('X [m]', fontsize=16, weight="bold")
pyplot.ylabel('Y [m]', fontsize=16, weight="bold")
# ----------
implot = subplot1.imshow( pyplot.imread('test.png') , interpolation='nearest', alpha=0.5)
# ----------
pyplot.show()
#pyplot.savefig("tmp.png", dpi=100)
pyplot.close()
...但我没有得到想要的结果...相反,我只看到了轮廓图部分。类似于:
我应该在代码中做些什么来得到我想要的东西?
2条答案
按热度按时间bq3bfh9z1#
你基本上需要做两件事,设置你想要的图像在背景中的范围。如果你不这样做,坐标被假设为像素坐标,在本例中x和y都是0到600。所以调整你的
imshow
命令为:如果要将图像自动拉伸到图的极限,可以使用以下命令获取范围:
并将其作为
extent=extent
传递给imshow
。由于它是背景图像,将alpha设置为0.5会使它非常暗淡,我会将其设置为1.0。
其次,设置轮廓线的alpha,但您可能也(或特别)希望设置
filled contours
的alpha。当您对填充轮廓使用alpha时,启用抗锯齿功能可减少伪像。因此,将contourf
命令更改为:由于您已经自己创建了子绘图对象,我建议您也使用它来进行绘图,而不是使用
pyplot
接口,后者在当前活动的轴上操作。因此:
取代:
通过上面提到的两个更改,我的结果如下所示:
deikduxw2#
我个人使用了一段时间的多重等值线图答案,效果很好。但是,我不得不输出我的数字到PostScript,它不支持不透明度(
alpha
选项)。我发现this答案很有用,因为它不需要使用不透明度。出现这些线的原因是组成轮廓图的面的边缘颜色。链接解决方案通过将边缘颜色更改为面颜色来避免这种情况。