我生成了一个Mandelbrot图形,作为10000x10000像素的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显示数组:
arr = np.zeros((10000, 10000)) # my array
import matplotlib.pyplot at plt
plt.imshow(arr)
plt.show()我得到了一个非常漂亮的彩色图像。
但是为什么
此外,如果我试图将其导出到.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")


有没有办法向巴布亚新几内亚输出这样的彩色图像?matplotlib似乎不是一个可行的选择,因为决议太糟糕了。
发布于 2015-11-11 20:44:50
正如我在上面的评论中提到的,savefig有一个dpi选项
例如:
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(10,10)) #
arr = np.random.random((10000,10000)) # my array
plt.imshow(arr)
plt.savefig('fig.png', dpi=1000)我不能张贴原来的PNG (它大约是200兆字节),但这给你更多的细节,你想要。一些放大了上面脚本输出的屏幕截图:


请注意,这样的数字(包括。边框、轴线标签等)是10000x10000像素,所以您仍然不能单独看到来自arr的实际10000x10000像素。ali_m和imsave的解决方案确实解决了这个问题,如果您不介意没有轴标签、titels等等的话。
发布于 2015-11-11 20:07:28
将2D数组传递给plt.imshow时,强度值将映射到RGBA值。这是根据一个称为颜色映射的查找表完成的,该表可以通过cmap=关键字参数指定。例如,要用灰度绘制Mandelbrot数组,可以选择'gray'颜色图:
plt.imshow(arr, cmap='gray')如果您不传递cmap=参数,matplotlib将使用任何默认值,您也可以在matplotlibrc文件中修改它。为了干净地安装当前版本的matplotlib,默认的是一个名为'jet'的彩色映射,如下所示:

是一个非常糟糕的彩色地图,有很多用途和不久将被替换为matplotlib v2.0中的默认颜色映射。您可以阅读更多关于在正式文件中选择共轨文件的信息。
您还可以向imshow传递一个3D数组,其中最终维度的大小为3或4。在这种情况下,最终维度被解释为每个像素的RGB(A)值。由于颜色信息已经包含在数组中,因此不需要查找表,因此cmap=参数将被忽略。
为了解决您问题的第二部分,将数组保存为共现的全分辨率.png图像的一种简单方法是使用plt.imsave,这也采用了cmap=参数:
plt.imsave('mandelbrot.png', arr, cmap='jet')plt.imsave只是导出数组中的原始像素,所以一个10000x10000输入数组将生成一个正好为10000x10000像素的.png图像。
相反,plt.savefig呈现整个图形画布(包括边距、轴、其他绘图元素等),并根据(1)图形的大小(以英寸为单位)和(2) dpi=关键字参数进行缩放。尽管通过将DPI设置为比您需要的要大得多,可以获得足够高的分辨率,但是使用这种方法呈现实际大小的数组要困难得多,因为您需要摆弄图形大小和/或DPI,以及轴的位置和大小等。
https://stackoverflow.com/questions/33657547
复制相似问题