我需要将matplotlib数字保存为pdf。我按照Matplotlib howto上的说明进行操作,但不是显示结果,而是将其保存为pdf。奇怪的是, pdf画布不受画布调整大小的影响。相反,使用放大的画布保存到png正常。
import matplotlib.pyplot as plt
import matplotlib.transforms as mtransforms
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(range(10))
ax.set_yticks((2,5,7))
labels = ax.set_yticklabels(('really, really, really', 'long', 'labels'))
def on_draw(event):
bboxes = []
for label in labels:
bbox = label.get_window_extent()
# the figure transform goes from relative coords->pixels and we
# want the inverse of that
bboxi = bbox.inverse_transformed(fig.transFigure)
bboxes.append(bboxi)
# this is the bbox that bounds all the bboxes, again in relative
# figure coords
bbox = mtransforms.Bbox.union(bboxes)
if fig.subplotpars.left < bbox.width:
# we need to move it over
fig.subplots_adjust(left=1.1*bbox.width) # pad a little
fig.canvas.draw()
return False
fig.canvas.mpl_connect('draw_event', on_draw)
plt.savefig("test.pdf", format="pdf")
更新
plt.tight_layout()
用于标题和轴刻度,但忽略图例,如果它放在框架外,如下图所示。请注意,我将图例放在图的右侧。
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
p1, = plt.plot(range(10))
p2, = plt.plot(range(10,0,-1))
ax.set_yticks((2,5,7))
plt.labels = ax.set_yticklabels(('really, really, really', 'long', 'labels'))
plt.legend([p2, p1], ["line with a loong label", "line with an even longer label, dude!"],\
loc="center left", bbox_to_anchor=(1, 0.5))
plt.tight_layout()
plt.savefig("test.pdf", format="pdf")
答案 0 :(得分:2)
可能的黑客攻击是将plt.tight_layout()
替换为
plt.tight_layout(rect = [0, 0, 0.4, 1])
但这不是很好。对我有用的是使用参数bbox_inches
:
plt.savefig("test.pdf", format="pdf", bbox_inches = 'tight')
答案 1 :(得分:-1)
使用可以尝试此示例并解决您的问题。
import matplotlib.pyplot as plt
import numpy as np
sin, cos = np.sin, np.cos
fig = plt.figure(frameon = False)
fig.set_size_inches(5, 8)
ax = plt.Axes(fig, [0., 0., 1., 1.], )
ax.set_axis_off()
fig.add_axes(ax)
x = np.linspace(-4, 4, 20)
y = np.linspace(-4, 4, 20)
X, Y = np.meshgrid(x, y)
deg = np.arctan(Y**3-3*Y-X)
plt.quiver(X, Y, cos(deg), sin(deg), pivot = 'tail', units = 'dots', color = 'red', )
plt.savefig('/tmp/test.png', dpi = 200)
通过将图形设置为5x8英寸
,可以将结果图像设置为1000x1600像素fig.set_size_inches(5, 8)
and saving with DPI = 200:
plt.savefig('/tmp/test.png', dpi = 200)
The code to remove the border was taken from here.
(The image posted above is not to scale since 1000x1600 is rather large).