matplotlib图片输出简记

最近在用matplotlib作图,应用到ppt上是时候,总是不方便,有各种问题,在网上搜寻了一番,为自己总结一番。

matplotlib输出图片

输出格式

支持输出的格式有eps, jpeg, jpg, pdf, pgf, png, ps, raw, rgba, svg, svgz, tif, tiff

输出方式

直接保存

通过作图导入的import matplotlib.pyplot as plt模块,我们在使用plt.show()方法查看图片时,右下角有保存图标,直接点击保存图标,填写图片名称,选择图片格式和位置,保存即可。

代码保存

1
2
3
import matplotlib.pyplot as plt
...
plt.savefig('***.svg',format='svg')

通过plt.savefig()方法,选择格式,填写位置和名称,运行即可。

应用ppt

图片放在ppt上展示的时候,不太清晰,就想选择矢量图。matplotlib输出的eps, svg, pdf等都有矢量效果,但能让ppt支持的只有一个eps,可惜eps格式ppt现在也有问题,导入进去不显示图片,我在网上找到了这篇文章I can no longer insert EPS graphics into PowerPoint来解决,但我试了没成功,有兴趣的可以点开,按照里面的方法试试。
但是pptemf支持效果还不错,可以通过Inkscape[1]软件转换svg格式为emf格式。

Inkscape

命令

Inkscape可以支持命令行功能,所以可以直接在python中调用,也可以打开inkscape程序,手动把svg格式转为emf格式。下面简单的介绍几个用法和命令[2]

inkscape [options] [filename ...]

options:

1
2
3
4
5
6
7
8
9
10
11
12
-?, --help
--usage
-V, --version

-f, --file=FILENAME

-e, --export-png=FILENAME
-P, --export-ps=FILENAME
-E, --export-eps=FILENAME
-d, --export-dpi=DPI
-w, --export-width=WIDTH
-h, --export-height=HEIGHT

示例

1
2
3
4
5
6
7
8
Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

C:\Users\Administrator>cd desktop

C:\Users\Administrator\Desktop>inkscape test.svg --export-emf=test.emf

C:\Users\Administrator\Desktop>

inkscape如果没有文件具体路径,默认在当前路径下寻找文件。
需要注意的是,安装Inkscape不会自动加入到环境变量,所以要想在命令行中调用inkscape,必须自己手动将安装路径加入到环境变量,用管理员权限运行cmd

批处理文件

运用批处理文件,一样可以实现。用记事本保存下面代码,后缀名为.bat,放在待转换文件的文件夹内,双击运行。

1
2
3
4
5
6
@echo off
for %%i in (*.svg) do (
echo %%i
inkscape -f %%i -M %%~ni.emf
)
@echo Finished

python实现

主要问题是如何通过python实现命令行输入。

os.system()

1
2
3
import os

os.system('python -V')

利用os.system()方法,直接输入代码,中间会打开cmd界面,不能获得返回值。

subprocess.Popen()

1
2
3
import subprocess

subprocess.Popen('python -V', shell=True, stdout=subprocess.PIPE, universal_newlines=True)

subprocess.Popen()参数比较多,常用的也就两三个。shell=True不会打开cmd界面,stdout是输出缓存,用read或者print方法读出。universal_newlines=True表明子进程的stdoutstderr被视为文本对象,并且不管是unix的行结束符'/n',还是老mac格式的行结束符'/r',还是windows格式的行结束符'/r/n'都将被视为 '/n'

subprocess其他方法

subprocess.call()

1
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)

subprocess.check_call()

1
subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False)

subprocess.check_output()

1
subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt
import numpy as np
import math
from pylab import *
import subprocess

plt.style.use('ggplot')
a=2
b=0
c=0.25
D=1.7
x=np.arange(-2,2,0.01)
y=[c+(1-c)/(1+math.exp(-D*a*(n-b))) for n in x]
plot([-2.5,-2],[0.25,0.25], color ='red',linestyle="--")
xticks([-2,-1.5,-1,-0.5,0,0.5,1,1.5,2])
yticks([0,0.25,0.5,0.75,1])
plt.title('Item Characteristic Curve')
plt.xlabel('$\\theta$')
plt.ylabel('Probability')
ylim(0,1.2)
x1=np.arange(-2,2,0.01)
plt.text(-2,1,r'$a=2$')
plt.text(-2,0.95,r'$b=0$')
plt.text(-2,0.9,r'$c=0.25$')
plt.plot(x,y)
plt.savefig('IRT.svg', format='svg')
subprocess.Popen('inkscape IRT.svg --export-emf=IRT.emf', shell=True) #不需要获得返回值

因为不需要获得返回值,处理的只有一张图片,所以写的比较简单。经处理的图片,可以直接在ppt中使用,效果还行。

参考资料

[1] : Word中插入Python“生成”的矢量图
[2] : Python多进程(1)——subprocess与Popen()
[3] : python中的subprocess.Popen()使用

-------------本文结束感谢您的阅读-------------
0%