【7】python_matplotlib 输出(保存)矢量图方法;画图时图例说明(legend)放到图像外侧;Python_matplotlib图例放在外侧保存时显示不完整问题解决

1.python_matplotlib 输出(保存)矢量图方法

用python的matplotlib画出的图,一般是需要保存到本地使用的。如果是用show()展出的图,再右键保存,这样的图是失帧而非矢量的

保存矢量图的方法是使用函数savefig(),官方资料:savefig)

savefig(fname, dpi=None, facecolor='w', edgecolor='w',
        orientation='portrait', papertype=None, format=None,
        transparent=False, bbox_inches=None, pad_inches=0.1,
        frameon=None, metadata=None)

     可以看到它的参数还是很多的,但保存矢量图只需要三个参数,即fname, 文件名称,和dpi, the resolution in dots per inch (每英寸点的分辨率), 以及format, 文件格式。

一个简单保存代码:

import matplotlib.pyplot as plt
 
# 随意绘制一个样图
plt.plot([1,2,3,4,3,2,3])
 
# 保存图为svg格式,即矢量图格式
plt.savefig("test.svg", dpi=300,format="svg")
  • 将保存的 test.svg文件 用 visio 打开,此时就能查看此矢量图;然后选中该图,复制到word 中即可
  • 或者直接图片插入到word里效果是一样的 

savefig()的format参数指出后台支持的文件格式包含:.png, .pdf, .ps, .eps, .svg

 当format未设置,而输入的fname包含文件格式的扩展时,保存的文件格式即为该扩展。

故上述的保存矢量图的代码可直接改为:效果一样

plt.savefig("test.svg", dpi=300)

dpi的数值设置

根据Wiley的关于图像的指导准则,一般折线图的dpi设置为600,而图像的dpi设置为300。

 2.Python_matplotlib画图时图例说明(legend)放到图像外侧

 用python的matplotlib画图时,往往需要加图例说明。如果不设置任何参数,默认是加到图像的内侧的最佳位置。

如何将该legend移到图像外侧,有多种方法,这里介绍一种。

在plt.legend()函数中加入若干参数:

plt.legend(bbox_to_anchor=(num1, num2), loc=num3, borderaxespad=num4)

bbox_to_anchor(num1,num2)表示legend的位置和图像的位置关系,num1表示水平位置,num2表示垂直位置。

  • num1=0表示legend位于图像的左侧垂直线(这里的其它参数设置:num2=0,num3=3,num4=0)。

  • num1=1表示legend位于图像的右侧垂直线(其它参数设置:num2=0,num3=3,num4=0)。

 为了美观,需要将legend放于图像的外侧,而又距离不是太大,一般设num1=1.05。

  • num2=0表示legend位于图像下侧水平线(其它参数设置:num1=1.05,num3=3,num4=0)。

  • num2=1表示legend位于图像上侧水平线(其它参数设置:num1=1.05,num3=3,num4=0)。

 如果希望legend位于图像的右下,需要将num2设为0,位于图像的右上,需要将num2设为1。

 由于legend是一个方框,bbox_to_anchor=(num1, num2)相当于表示一个点,那么legend的哪个位置位于这个点上呢。参数num3就用以表示哪个位置位于该点。

 参数num4表示轴和legend之间的填充,以字体大小距离测量,默认值为None,但实际操作中,如果不加该参数,效果是有一定的填充,下面有例图展示,我这里设为0,即取消填充

 最终推荐代码效果:右上角比较合适是

import matplotlib.pyplot as plt
import numpy as np
 
x = np.arange(10)
 
fig = plt.figure()
ax = plt.subplot(111)
 
for i in xrange(5):
    ax.plot(x, i * x, label='$y = %ix$' % i)
 
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0)
 
plt.show()

参考链接:Python_matplotlib画图时图例说明(legend)放到图像外侧_Poul_henry的博客-优快云博客_python画图legend显示在左上角

 3.Python_matplotlib图例放在外侧保存时显示不完整问题解决

 可以看到放在图像右上的图例只显示了左边一小部分。

造成这个原因:savefig()函数进行保存矢量图时,它是通过一个bounding box (bbox, 边界框),进行范围的框定,只将落入该框中的图像进行保存,如果图例没有完全落在该框中,自然不能被保存。

 解决方案:

1. 将没有完全落入该bbox的图像,通过移动的方法,使其完全落入该框中,那么bbox截取的图像即是完整的 (将图像移入bbox中);

2. 改变bbox的大小,使其完全包含该图像,尤其是往往落入bbox外侧的图例 (将bbox扩大到完全包含图像)。

 3.1  利用函数subplots_adjust()

 它包含6个参数,其中4个参数left, right, bottom, top的作用是分别调整子图的左部,右部,底部,顶部的位置,另外2个参数wspace, hspace的作用分别是调整子图之间的左右之间距离和上下之间距离。

默认值为:

 现考虑既然图例右侧没有显示,则调整subplots_adjust()函数的right参数,使其位置稍往左移,将参数right默认的数值0.9改为0.8,那么可以得到一个完整的图例:

 3.2 利用函数savefig()---更加美观点吧

 使用savefig()函数中的三个参数fname, dpi, format可用以保存矢量图,现用该函数中另一个参数bbox_inches使未保存到图中的图例包含进来。

下图可以看到,bbox_inches的作用是调整图的bbox, 即bounding box(边界框)

可以看到,当bbox_inches设为'tight'时,它会计算出距该图像的较紧(tight)边界框bbox,并将该选中的框中的图像保存。

这里的较紧的边界框应该是指完全包含该图像的一个矩形,但和图像有一定的填充距离,和Minimum bounding box(最小边界框),个人认为,有一定区别。单位同样是英寸(inch)。

这样图例就会被bbox包含进去,进而被保存


fig.savefig('scatter2.png',dpi=600,bbox_inches='tight')

 直接看保存好的svg会发现已经生成好了、

参考链接:Python_matplotlib图例放在外侧保存时显示不完整问题解决_Poul_henry的博客-优快云博客_bbox_inches

### 回答1: 在使用Pythonmatplotlib画图,有会遇到图例放在外侧保存图片显示完整问题。这是由于matplotlib默认在保存图片保存图形区域,而没有保存图例区域所致。 解决问题方法很简单,只需要在保存图片前手动调整图片边缘并设置合适的图例边距即可。具体步骤如下: 1. 在plt.savefig()函数中指定保存图片的大小和分辨率,例如: plt.savefig('figure.png', dpi=300, bbox_inches='tight', pad_inches=0.1) 其中dpi参数指定分辨率,bbox_inches参数按照紧凑型保存,pad_inches参数指定图例边距。 2. 在调整图例位置,可以使用legend()函数的loc参数进行控制。例如: plt.legend(loc='upper left', bbox_to_anchor=(1.02, 1)) 其中loc参数指定图例位置,bbox_to_anchor参数指定图例在画布上的坐标位置。 通过上述方法,我们就可以轻松解决matplotlib图例放在外侧保存时显示完整问题,使保存的图片与我们的期望相一致。 ### 回答2: Matplotlib是一个强大的Python数据可视化库,可以用来创建各种类型的图表,包括线图、散点图、柱状图、饼图等。在Matplotlib中,图例是一种非常重要的可视化元素,可以帮助我们更好地理解数据并提高图表的可读性。但是,有候我们在绘制图表会遇到图例放在外侧保存时显示完整问题,这可能会影响我们的数据可视化效果。接下来,我将分享一些解决这个问题方法。 第一种方法是调整图像边缘的大小。我们可以通过将图像边缘的大小扩大一些来解决图例显示完整问题。例如,我们可以使用以下代码来调整图像边缘的大小: ```python import matplotlib.pyplot as plt fig, ax = plt.subplots() ax.plot([1, 2, 3], label='Line 1') ax.plot([3, 2, 1], label='Line 2') ax.legend(bbox_to_anchor=(1.05, 1), loc='upper left') plt.subplots_adjust(right=0.7) plt.savefig('figure.png', bbox_inches='tight') ``` 在这个例子中,我们首先创建了一个图像,并在其中绘制了两条线。然后,我们使用bbox_to_anchor参数将图例放在图像的右上角,然后使用plt.subplots_adjust()函数调整了图像的边缘。最后,我们使用plt.savefig()函数将图像保存到本地文件中,并使用bbox_inches参数指定了图像边缘的大小。 第二种方法是将图例放在子图之外。我们可以将图例放在子图之外,然后使用tight_layout()函数自动调整子图和图例的位置。例如,我们可以使用以下代码来将图例放在子图之外: ```python import matplotlib.pyplot as plt fig, ax = plt.subplots() ax.plot([1, 2, 3], label='Line 1') ax.plot([3, 2, 1], label='Line 2') ax.legend(bbox_to_anchor=(1.05, 1), loc='upper left') plt.tight_layout() plt.savefig('figure.png') ``` 在这个例子中,我们首先创建了一个图像,并在其中绘制了两条线。然后,我们使用bbox_to_anchor参数将图例放在图像的右上角,然后使用tight_layout()函数自动调整了子图和图例的位置。最后,我们使用plt.savefig()函数将图像保存到本地文件中。 总之,如果我们遇到了Matplotlib图例放在外侧保存时显示完整问题,可以考虑通过调整图像边缘的大小或将图例放在子图之外的方法解决。这些方法非常简单易行,可以帮助我们更好地展示数据并提高图表的可读性。 ### 回答3: 问题描述: 在使用Pythonmatplotlib库绘制图形,有需要将图例放在外侧。然而,当将图例放在外侧保存图形,有会出现图例显示完整问题,如下图所示: 问题原因: 这个问题的原因是,当将图例放在外侧matplotlib会自动调整图例的大小以适应图例的位置。然而,如果图例的大小太大,将会超出图像的范围,导致图例显示完整解决办法: 有多种方法可以解决这个问题,我将介绍其中两种方法方法一:调整figure的大小 可以通过调整figure的大小来解决这个问题。具体地说,我们可以增大figure的宽度,以便使图例可以完整显示。例如,可以使用以下代码: ```python import matplotlib.pyplot as plt fig = plt.figure(figsize=(8, 6)) # 调整figure的大小 ax = fig.add_subplot(111) ax.plot([1, 2, 3], [4, 5, 6], label='Line 1') ax.plot([1, 2, 3], [6, 5, 4], label='Line 2') ax.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0) # 将图例放在右上角 plt.savefig('figure.png', bbox_inches='tight') # 保存图形,注意要加上bbox_inches='tight'参数 plt.show() ``` 这个方法的思路是,通过增大figure的宽度,将图例完整地放置在右侧,使得图例可以完整显示在图外侧。注意,在保存图形,要加上`bbox_inches='tight'`参数,以便将整个图像保存在文件中。 方法二:调整图例的尺寸 另一种解决方法是,调整图例的尺寸,使得图例可以适应图外侧的位置。可以使用以下代码: ```python import matplotlib.pyplot as plt fig = plt.figure() ax = fig.add_subplot(111) ax.plot([1, 2, 3], [4, 5, 6], label='Line 1') ax.plot([1, 2, 3], [6, 5, 4], label='Line 2') legend = ax.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0) plt.setp(legend.get_lines(), linewidth=2) # 设置图例中线条的粗细 plt.savefig('figure.png', bbox_inches='tight') # 保存图形,注意要加上bbox_inches='tight'参数 plt.show() ``` 这个方法的思路是,将图例的尺寸调整到适合的大小,使得图例可以完整显示在图外侧。可以使用`plt.setp()`函数来设置图例中线条的粗细和其他属性。同样地,在保存图形,要加上`bbox_inches='tight'`参数。 总结: 在使用Pythonmatplotlib库绘制图形,如果需要将图例放在外侧保存图形,可能会出现图例显示完整问题解决这个问题方法有多种,其中两种方法分别是通过调整figure的大小和调整图例的尺寸。在应用这些方法,需要注意保存图形加上`bbox_inches='tight'`参数,以便将整个图像保存在文件中。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汀、人工智能

十分感谢您的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值