还在用OriginLab绘图?你已经Out啦。现在可以用Python会出超级好看的数据图,开源免费还不输Origin。

基础环境

使用python绘制数据图需要几个python包:

  • matplotlib,用来绘图
  • numpy,用来进行矩阵运算
  • xlrd,用来从excel读取数据

这几个包都是支持python2和python3的,不过新版的matplotlib貌似已经不再支持python2了,所以推荐全部使用python3环境。安装这几个包很简单,使用pip3就行:

1
2
3
sudo pip3 install matplotlib
sudo pip3 install numpy
sudo pip3 install xlrd

推荐使用spyder集成开发环境来工作,这可比简单的笔记本写python好多了。Spyder的安装见另一个文章。

从Excel读取数据

看代码:

1
2
3
4
5
6
7
8
9
10
import numpy as np
import matplotlib.pyplot as plt
import xlrd

data=xlrd.open_workbook("data.xlsx")#将data.xlsx读入data变量
sheet0=data.sheets()[0]#将data中的第一个sheet读入sheet0

x=sheet0.col_values(0)#将sheet0中第一列读入x
y1=sheet0.col_values(1)
y2=sheet0.col_values(2)

绘图

绘图主要使用matplotlib的功能,由于我们已经将matplotlib作为plt导入,所以:

1
2
line1,=plt.plot(x,y1,linestyle="--",color="red",marker="o")
line2,=plt.plot(x,y2,linestyle="--",color="blue",marker="v")

注意这里line1和line2分别是对应两条曲线的变量名,注意逗号。plot中的前两个变量是x和y。

linestyle指的是线型,常用的线性有四种:
符号 线型
‘-‘ 实线
‘–’ 虚线
‘-.’ 点划线
‘:’ 点线
color的颜色则比较多,具体可以看这张图:

marker指的数据点的形式,我摘录了部分:
符号 标记 符号 标记 符号 标记
‘.’ point marker ‘,’ pixel marker ‘o’ circle marker
‘v’ triangle_down marker ‘^’ triangle_up marker ‘<’ triangle_left marker
‘>’ triangle_right marker ‘1’ tri_down marker ‘2’ tri_up marker
‘3’ tri_left marker ‘4’ tri_right marker ‘s’ square marker
‘p’ pentagon marker ‘*’ star marker ‘h’ hexagon1 marker
‘H’ hexagon2 marker ‘+’ plus marker ‘x’ x marker
‘D’ diamond marker ‘d’ thin_diamond marker ‘_’ hline marker

设置格式

1
2
3
4
5
6
7
8
plt.xlim(0,20)
plt.ylim(0,5)
plt.xlabel('x value')
plt.ylabel('y value')

plt.rcParams['xtick.direction']='in'
plt.rcParams['ytick.direction']='in'
plt.rcParams['figure.dpi'] = 300
  • xlim和ylim设置x和y的绘图范围
  • xlabel和ylabel是x和y轴的名字
  • plt.rcParams[‘xtick.direction’]用来设置坐标轴上刻度线的方向,in指的是刻度线在坐标轴内部,还可以设置为out。
  • figure.dpi用来设置图像dpi,默认比较低,这里建议用300。

图例

1
plt.legend([line1,line2],['First','Second'],loc = 'upper left')

内容大家对照之前的代码和下面的图就能猜到了,值得一说的是loc,可以用upper,down,center,right和left来控制位置,或者直接用best让python自己选择最佳位置。

放一个刚刚画好的图:

这张图对应的代码如下:

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
31
32
33
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sun Dec 2 20:01:32 2018

@author: spacexi
"""

import numpy as np
import matplotlib.pyplot as plt
import xlrd

data=xlrd.open_workbook("data.xlsx")
sheet0=data.sheets()[0]

x=sheet0.col_values(0)
y1=sheet0.col_values(1)
y2=sheet0.col_values(2)


plt.xlim(0,20)
plt.ylim(0,5)
plt.xlabel('x value')
plt.ylabel('y value')

plt.rcParams['xtick.direction']='in'
plt.rcParams['ytick.direction']='in'
plt.rcParams['figure.dpi'] = 300

line1,=plt.plot(x,y1,linestyle="--",color="red",marker="o")
line2,=plt.plot(x,y2,linestyle="--",color="blue",marker="v")

plt.legend([line1,line2],['First','Second'],loc = 'upper left')