(完美解决)matplotlib图例(legend)如何自由设置其位置大小以及样式。
Posted 音程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(完美解决)matplotlib图例(legend)如何自由设置其位置大小以及样式。相关的知识,希望对你有一定的参考价值。
文章目录
前言
plt.legend()
我们知道,这一条代码会帮我们显示图例,而且通常,其会放置在图片中一个不错的位置。但是如果我们的数据,占满了整个图像,此时,其放的位置就会出问题了。
那么我们该如何自由设置图例位置呢?
位置:loc
这个参数内置了一些位置,如果这些位置恰好有你想要的,那么用这个就行了,很方便。
plt.legend(loc=1)#这个就等价于将图例放置在右上角的位置。
位置:bbox_to_anchor
这个是绝招,因为其可以控制任意位置。
plt.legend(bbox_to_anchor=(1,0))
这个玩意是一个坐标,原点就是图的左下角。但是,这个坐标的数值表示的是比例。比如
(1,0)#右下角
(0,1)#左上角
(0.5,0.5)#中间
(0.4,0.4)#中间往左下一点,哈哈。
所以说,很简单了,你自己慢慢调到你想要的位置就行了。注意,上面还支持负数哦。
最终,成功调节到了一个中间,偏左的位置哈哈。
吃水不忘挖井人,学习自https://www.freesion.com/article/239347665/
大小
我们只需要legend函数里面传入下面这个东西即可。
legend(prop = 'size':8)
据我所知,在matplotlib,这个prop变量几乎可以用在任何地方,不只是legend。
样式
我们看到的样式总是竖排的,每次都是,其实我们可以更改之,比如我们有两个图例,那么我们设置下面这个为2,就是默认并排展示,而不是并列展示。
legend(ncol=2)#默认为1,并列展示。
从而变成如下的图例。
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()
参考链接:https://blog.csdn.net/Poul_henry/article/details/82533569?spm=1001.2014.3001.5501
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会发现已经生成好了、
参考链接:https://blog.csdn.net/Poul_henry/article/details/88311964?spm=1001.2014.3001.5501
以上是关于(完美解决)matplotlib图例(legend)如何自由设置其位置大小以及样式。的主要内容,如果未能解决你的问题,请参考以下文章
python_matplotlib 输出(保存)矢量图方法;画图时图例说明(legend)放到图像外侧;Python_matplotlib图例放在外侧保存时显示不完整问题解决
Python可视化(matplotlib)图像自定义图例(Legend)
python使用matplotlib可视化线图(line plot)并为可视化图像添加图例(legend)信息(add legend to matplotlib plot)