我生成了一个Mandelbrot图形作为10000x1000像素numpy数组:
[[ 100. 100. 100. ..., 12. 12. 13.]
[ 100. 100. 100. ..., 12. 13. 14.]
[ 100. 100. 100. ..., 12. 12. 14.]
...,
[ 3. 3. 3. ..., 3. 3. 3.]
[ 3. 3. 3. ..., 3. 3. 3.]
[ 3. 3. 3. ..., 3. 3. 3.]]
如果使用matplotlib显示数组:
^{pr2}$我得到了一个非常好的彩色图像。在
但是为什么要这样呢?在
除此之外,如果我尝试将其导出到.png
我会得到一个黑白图像:
import PIL.Image as im
iimg = im.fromarray(arr)
iimg = iimg.convert("RGB") # std was "F", but it didn't work
iimg.save("img_mandelbrot.png")
有没有办法将这种彩色图像导出到png? matplotlib似乎不是一个可行的选择,因为分辨率太差。在
向^{} 传递二维数组时,强度值将映射到RGBA值。这是根据一个名为colormap的查找表来完成的,该表可以通过
cmap=
关键字参数指定。例如,要以灰度绘制Mandelbrot数组,可以选择'gray'
颜色贴图:如果不传递} 文件中进行修改。对于当前版本matplotlib的干净安装,默认值是一个名为
cmap=
参数,matplotlib将使用默认值,您也可以在^{'jet'
的colormap,如下所示:^{} is a pretty terrible colormap for many purposes ,和will soon be replaced as the default colormap in matplotlib v2.0。您可以在official documentation中阅读有关选择颜色贴图的更多信息。在
您还可以将一个3D数组传递给
imshow
,其中最终维度的大小为3或4。在这种情况下,最终尺寸被解释为每个像素的RGB(A)值。由于颜色信息已经包含在数组中,因此不需要查找表,因此cmap=
参数将被忽略。在为了解决问题的第二部分,将数组保存为彩色映射的全分辨率} ,这也需要一个
^{pr2}$.png
图像的一个简单方法是使用^{cmap=
参数:plt.imsave
只导出数组中的原始像素,因此10000x1000输入数组将生成一个正好为10000x1000像素的.png
图像。在相反,^{} 呈现整个图形画布(包括边距、轴、其他绘图元素等),并根据(1)图形的大小(以英寸为单位)和(2)关键字参数
dpi=
来缩放。尽管只需将DPI设置为比需要的大得多就可以获得足够高的分辨率,但是使用此方法以实际大小渲染数组将更加困难,因为您需要调整图形大小和/或DPI以及轴的位置和大小等正如我在上面的评论中提到的,
savefig
有一个dpi
选项例如:
我不能发布原始的PNG(大约200兆字节),但这给了你想要的任何细节。上面脚本输出的一些缩放屏幕截图:
注意,通过这种方式,图形(包括边框、轴标签等)是10000x1000像素,因此您仍然无法单独看到来自
arr
的实际10000x1000像素。如果你不介意没有轴标记、滴度等,ali嫒m的解决方案确实解决了这个问题。在相关问题 更多 >
编程相关推荐