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的博客-CSDN博客_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的博客-CSDN博客_bbox_inches

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

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

    https://blog.csdn.net/Poul_henry/article/details/82533569 import matplotlib.pyplot as plt import num ...

  2. Android中使用SVG矢量图(一)

    SVG矢量图介绍 首先要解释下什么是矢量图像,什么是位图图像? 1.矢量图像:SVG (Scalable Vector Graphics, 可伸缩矢量图形) 是W3C 推出的一种开放标准的文本式矢量图 ...

  3. Qt使用QPainter绘制矢量图并保存为svg文件

    位图和矢量图: Bitmap: Usually a larger file size Cannot be enlarged into a higher resolution as the image ...

  4. Python游戏引擎开发(七):绘制矢量图

    今天来完毕绘制矢量图形. 没有读过前几章的同学,请先阅读前几章: Python游戏引擎开发(一):序 Python游戏引擎开发(二):创建窗体以及重绘界面 Python游戏引擎开发(三):显示图片 P ...

  5. csv读入数据,用julia/matplotlib/pyplot 画矢量图导入word中

    这是是用julia来实现画图.julia有三个画图库:Winston.Gadfly.PyPlot 这里用的是pyplot,事实上他是基于matplotlib的 1.首先在juno里安装两个库 juno ...

  6. PaintCode 教程:矢量图轻松转换成CoreGraphics代码

    本文译自Ranwenderlich的这篇:http://www.raywenderlich.com/100281/paintcode-for-designers-getting-started Pai ...

  7. [超级懒人最简单法]iPhone 6 plus 适配切图方法分享(转载文章)

    网络上已经有很多适配教程,可是看了半天总是半懂不懂..最后还是要综合多个教程再动动脑子动动手,最好有程序大哥帮你试一下(这得有多大的福气) 如果有跟我一样情况的: 1.       有人说用sketc ...

  8. svg矢量图绘制以及转换为Android可用的VectorDrawable资源

    项目需要 要在快速设置面板里显示一个VoWiFi图标(为了能够区分出来图形,我把透明的背景填充为黑色了) 由于普通图片放大后容易失真,这里我们最好用矢量图(SVG(Scalable Vector Gr ...

  9. Python matplotlib图片转化成矢量图并裁剪

    Python目前可以生成的图的格式是:eps, jpeg, jpg, pdf, pgf, png, ps, raw, rgba, svg, svgz, tif, tiff 在写论文时候我一般生成png ...

  10. svg矢量图

    svg简介 Scalable Vector Graphics 可缩放矢量图形 SVG 图像在放大或改变尺寸的情况下其图形质量不会有所损失 svg知识点 svg如何绘图 svg和cnavas区别 svg ...

随机推荐

  1. Spark面试题(六)——Spark资源调优

    Spark系列面试题 Spark面试题(一) Spark面试题(二) Spark面试题(三) Spark面试题(四) Spark面试题(五)--数据倾斜调优 Spark面试题(六)--Spark资源调 ...

  2. Android 黑马 52 期视频,不加密,免费下载

    Android 黑马学习视频 目录 01.安卓基础+JNI (14天) 02.Android应用开 发-代码版本管理和实战(1天) 03.android案 例与项目_手机安全卫士(12天) 04.自定 ...

  3. awk 文本编辑器

    1.简介 文本编辑器 非交互式的编辑器 编程语言 功能:对文本数据进行汇总和处理 是一个报告生成器 能够对数据进行排版 工作模式:行工作模式 读入一行 将整行内容存在$0里,一行等于一个记录 记录分隔 ...

  4. 使用nginx代理emqx的TCP、WS、WSS连接请求

    项目代理关系: 注:主机上已存在名为:nginx-proxy 的一级 nginx 的代理,将监听了主机的 80.443端口 docker-compose.yml version: "3.7& ...

  5. C++ 智能指针的正确使用方式

    C++11 中推出了三种智能指针,unique_ptr.shared_ptr 和 weak_ptr,同时也将 auto_ptr 置为废弃 (deprecated). 但是在实际的使用过程中,很多人都会 ...

  6. Markdown 语法:高级技巧

    Markdown 高级技巧 支持的 HTML 元素 不在 Markdown 涵盖范围之内的标签,多可以直接在文档里面用 HTML 撰写. 目前支持的 HTML 标签有 <kbd>,< ...

  7. JSP 简单入门与 IDEA 开发环境配置

    原作者为 RioTian@cnblogs, 本作品采用 CC 4.0 BY 进行许可,转载请注明出处. 在学 Java 连接数据库时老师提到过 JSP,刚好这个学期有 JSP 的课程,现做一些基础以及 ...

  8. Educational Codeforces Round 97 (Rated for Div. 2) (A - D题个人题解)

    1437A. Marketing Scheme 题意:最近猫粮店正在打折销售猫粮罐头,在给定客人能买的罐头数量区间内求合适包装大小 思路:说实话,在比赛刚开始没看懂题,最后放弃读题直接研究给出的样例解 ...

  9. WIN32 动态 UAC 提权

    UAC(User Account Control) 是 Windows 平台的用户权限控制.它可以让程序使用管理员权限执行某些操作. 静态 UAC 提权 静态 UAC 提权让程序一直运行在管理员权限下 ...

  10. Java循环标签

    大家是否见过这种for循环,在for循环前加了个标记的: outerLoop: for (; ; ) { for (; ; ) { break outerLoop; } } 我之前有一次在公司业务代码 ...