为什么.imshow()生成的像素比我放入的像素多?

时间:2015-10-01 14:05:35

标签: python matplotlib

我有一个numpy数组 A ,形状为(60,60,3),我正在使用:

plt.imshow(  A,
             cmap          = plt.cm.gist_yarg,
             interpolation = 'nearest',
             aspect        = 'equal',
             shape         = A.shape
             )
plt.savefig( 'myfig.png' )

当我检查myfig.png文件时,我发现它是1200x800像素(彩色)。

这里发生了什么?我期待一张60x60的RGB图像。

3 个答案:

答案 0 :(得分:1)

matplotlib不直接使用像素,而是图形尺寸(以英寸为单位)和分辨率(每英寸点数,dpi

因此,您需要明确给出数字大小和dpi。例如,您可以将图形大小设置为1x1英寸,然后将dpi设置为60,以获得60x60像素的图像。

您还必须删除绘图区域周围的空白,您可以使用subplots_adjust

import numpy as np
import matplotlib.pyplot as plt

plt.figure(figsize=(1,1))

A = np.random.rand(60,60,3)

plt.imshow(A,
           cmap=plt.cm.gist_yarg,
           interpolation='nearest',
           aspect='equal',
           shape=A.shape)

plt.subplots_adjust(left=0,right=1,bottom=0,top=1)

plt.savefig('myfig.png',dpi=60)

这创造了这个数字:

enter image description here

尺寸为60x60像素:

$ identify myfig.png 
myfig.png PNG 60x60 60x60+0+0 8-bit sRGB 8.51KB 0.000u 0:00.000

你也可以参考this answer,它有很多关于数字大小和分辨率的好信息。

答案 1 :(得分:0)

由于public class JsonForm extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); JSONObject myObject = new JSONObject(); myObject.put("firstname","Mike"); myObject.put("lastname","J"); myObject.put("email","j@mail.com"); out.println(myObject); JSONObject myRecord = new JSONObject(); myRecord.put("firstname","Mike"); myRecord.put("lastname","J"); myRecord.put("email","j@mail.com"); JSONArray myRecords = new JSONArray(); myRecords.add(myRecord); } } //grid Ext.onReady(function(){ Ext.define('myRecord',{ extend: 'Ext.data.Model', proxy: { type: 'memory', reader: 'json' }, fields: [ // set up the fields mapping into the xml doc // The first needs mapping, the others are very basic 'firstName','lastName', 'email' ] }); var gridStore = Ext.create('Ext.data.JsonReader', { autoLoad: true, proxy: { // load using HTTP type: 'ajax', url: '', // the return will be XML, so lets set up a reader reader: { type: 'json', // records will have an "Item" tag root: 'myRecord' } } }); grid = Ext.create('Ext.grid.Panel', { store: gridStore, // selModel: sm, columnLines: true, frame: true, columns: [ {text: "First Name", flex:1, dataIndex: 'firstName', tdCls: 'no-dirty'}, {text: "Last Name", flex:1, dataIndex: 'lastName', tdCls: 'no-dirty'}, {text: "Email", flex:1, dataIndex: 'email', tdCls: 'no-dirty',} ], renderTo:Ext.getBody(), width: '100%', height: 650 }); }); 会根据您的数据呈现图片并且具有选项plt.savefig(每英寸点数),因此会将其设置为某个默认值。您可以通过执行dpi

来更改数字的质量

答案 2 :(得分:-2)

真正的Matplotlib引擎是高度抽象的,而Renderers ......

作为初步评论, matplotlib 工具箱有助于创建大量的2D / 3D绘图,同时支持的构图智能叠加> pixmap-DataSET -s

(“ 图片 ”可以设想为{3D [对于 RGB ] | 4D [{strong} RGBA ] }-colourspace数据pixmap-DataSet - s 2D-[x,y] - 将颜色映射到“2D - 纸“

因此,可以通过pixmap-DataSET方法覆盖/查看/保存 matplotlib 图片

如何制作pixmap尺寸设置?

对于 “picture” 对象,对于无限数字precision和任意深度LevelOfDetail的无约束世界来说,它是“特殊的”在 matplotlib 中,有一些设置会在处理生命周期的最后阶段 - 在输出生成时刻考虑。

所以,
matplotlib可以指示(预先)选择 Renderer ,以特殊印刷密度生成最终图形输出。 ..又名 dpi = 60 每英寸点数
还提供整体尺寸 .. 。 figsize = ( 1, 1 ) ,这使您的60 x 60图像精确为60x60像素(一旦您花费更多精力来强制matplotlib禁用所有边缘和其他特定于布局的环境)< / p>

叠加合成也可以使用 .figimage() 方法,其中可以另外指定x0 = x_PX_OFFSETy0 = y_PX_OFFSET详细信息,了解从哪里开始放置给定figsize * dpi像素映射区域内的图片数据。