你如何改变用matplotlib绘制的图形的大小?
我有一个SVG文件,其定义大小为16x16.当我使用Image Magick的转换程序将其转换为PNG时,我得到一个16x16像素的PNG,这太小了:
convert test.svg test.png
Run Code Online (Sandbox Code Playgroud)
我需要指定输出PNG的像素大小.-size参数似乎被忽略,-scale参数在转换为PNG 后缩放PNG.到目前为止,我通过使用-density参数得到了最好的结果:
convert -density 1200 test.svg test.png
Run Code Online (Sandbox Code Playgroud)
但是我不满意,因为我想要以像素为单位指定输出大小而不用数学来计算密度值.所以我想做这样的事情:
convert -setTheOutputSizeOfThePng 1024x1024 test.svg test.png
Run Code Online (Sandbox Code Playgroud)
那么我在这里使用的神奇参数是什么?
我有一个Numpy数组类型的矩阵.我如何将其作为图像写入磁盘?任何格式都有效(png,jpeg,bmp ......).一个重要的限制是PIL不存在.
我需要拍摄一张图像并在一些过程后保存.当我显示它时,图形看起来很好,但是当我保存图形时,我在保存的图像周围有一些空白区域.我试过方法的'tight'选项savefig,也没用.代码:
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
fig = plt.figure(1)
img = mpimg.imread(path)
plt.imshow(img)
ax=fig.add_subplot(1,1,1)
extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig('1.png', bbox_inches=extent)
plt.axis('off')
plt.show()
Run Code Online (Sandbox Code Playgroud)
我试图通过在图上使用NetworkX绘制基本图并保存它.我意识到没有图形它可以工作,但是当添加图形时,我会在保存的图像周围获得空白区域;
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import networkx as nx
G = nx.Graph()
G.add_node(1)
G.add_node(2)
G.add_node(3)
G.add_edge(1,3)
G.add_edge(1,2)
pos = {1:[100,120], 2:[200,300], 3:[50,75]}
fig = plt.figure(1)
img = mpimg.imread("C:\\images\\1.jpg")
plt.imshow(img)
ax=fig.add_subplot(1,1,1)
nx.draw(G, pos=pos)
extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig('1.png', bbox_inches = extent)
plt.axis('off')
plt.show()
Run Code Online (Sandbox Code Playgroud) 之前已经提出过类似的问题,但我的所有搜索结果都没有解决我的问题.请参考以下示例代码:
from matplotlib.pyplot import *
fig = figure(1, figsize=(3.25, 3))
plot([0,1,5,2,9])
title('title')
xlabel('xAxis')
ylabel('yAxis')
fig.savefig('test.png',dpi=600)
Run Code Online (Sandbox Code Playgroud)
得到的数字是2040x1890像素,或3.4"x3.15",并且x标签被切断.在图像编辑器中查看PNG文件,轴和刻度标签似乎符合所需的大小.我已经尝试从输出大小和请求的大小中取出差异并将其反馈到(3.25 - (3.4-3.25)= 3.10,但是matplotlib似乎添加了一个任意缓冲区并且它仍然没有达到所需的大小.如何制作出所需尺寸的整体数字?
所以我想将频谱图图像提供给卷积神经网络,以尝试对各种声音进行分类。我希望每个图像都是 384x128 像素。但是,当我实际保存图像时,它只有 297x98。这是我的代码:
def save_spectrogram(num):
dpi = 128
x_pixels = 384
y_pixels = 128
samples, sr = load_wave(num)
stft = np.absolute(librosa.stft(samples))
db = librosa.amplitude_to_db(stft, ref=np.max)
fig = plt.figure(figsize=(x_pixels//dpi, y_pixels//dpi), dpi=dpi, frameon=False)
ax = fig.add_subplot(111)
ax.axes.get_xaxis().set_visible(False)
ax.axes.get_yaxis().set_visible(False)
ax.set_frame_on(False)
librosa.display.specshow(db, y_axis='linear')
plt.savefig(TRAIN_IMG+str(num)+'.jpg', bbox_inches='tight', pad_inches=0, dpi=dpi)
Run Code Online (Sandbox Code Playgroud)
有没有人对我如何解决这个问题有任何指示?我也试过在没有子图的情况下这样做,但是当我这样做时,它仍然保存为错误的大小并且有空白/背景。
我想以像素为单位保存一个精确大小的 matplotlib 图。在下面的代码中,这个确切的大小是 500x500 像素。虽然保存的图像是 500x500 像素,但它包括我的形状和绘图区域周围的填充。我希望圆圈紧靠边界。相反,我的圈子周围有空白。是否可以只保存绘图区域?请注意,虽然下面的代码是可重现的,但 my_dpi 取决于您的显示器 DPI。220 是我的显示器的 DPI。
import matplotlib.pyplot as plt
import matplotlib.image as mpimage
import numpy as np
H = 500
W = 500
radius = H/2
my_dpi = 220
a = np.deg2rad(0)
b = np.deg2rad(360);
t = np.linspace(a,b,100)
x = radius*np.cos(t)
y = radius*np.sin(t)
x = np.append(x,[0,x[0]])
y = np.append(y,[0,y[0]])
myFig = plt.figure()
DPI = my_dpi #myFig.get_dpi()
myFig.set_size_inches(float(H)/float(DPI),float(W)/float(DPI))
plt.fill(y,x,color='none',facecolor='red')
plt.axis((-W/2,W/2,-H/2,H/2))
plt.axis('off')
#plt.show()
plt.savefig('my_fig.png',dpi=DPI)
print 'Figure Size: ', myFig.get_size_inches()
Im = mpimage.imread('my_fig.png')
print 'Im …Run Code Online (Sandbox Code Playgroud) 我正在尝试以其真实尺寸渲染图像(未缩放或拉伸),并且使用 matplotlib 执行此操作的最简单方法似乎是figimage.
但是,当我尝试在 Jupyter 笔记本中使用它时,该图没有显示。其他图显示良好,这似乎只影响figimage:
正如您所看到的,第一个图显示得很好,但第二个图则不然。我究竟做错了什么?
当我在 IPython shell 中运行以下代码时,该图按预期显示,所以可能是我的 Jupyter 设置有问题?
import matplotlib
from matplotlib import pyplot as plt
import numpy as np
x = np.linspace(0, 2*np.pi, 500)
plt.plot(x, np.sin(x))
plt.show()
data = np.random.random((500,500))
plt.figimage(data)
plt.show()
Run Code Online (Sandbox Code Playgroud)