matplotlib画图

matplotlib画图

基础

最简单的图

例子:

import numpy as np #导入numpy包
import matplotlib.pyplot as plt #导入matplotlib包

x = [0, 1] #x轴
y = [0, 1] #y轴
plt.figure() #创建绘图对象
plt.plot(x, y) #画图
plt.show() #显示图像
plt.savefig("easyplot.png") #保存图片

1552288685863

给图加上标签与标题

import numpy as np #导入numpy包
import matplotlib.pyplot as plt #导入matplotlib包

x = [0, 1] #x轴
y = [0, 1] #y轴
plt.figure() #创建绘图对象
plt.xlabel("time(s)") #x轴标签
plt.ylabel("value(m)") #y轴标签
plt.title("A simple plot") #标题
plt.plot(x, y) #画图
plt.show() #显示图像
plt.savefig("easyplot.png") #保存图片

1552288657353

sinx曲线

import numpy as np
import matplotlib.pyplot as plt

#设置x,y轴的数值(y=sinx)
x=np.linspace(0,10,1000)
y=np.sin(x)

#创建绘图对象,figsize参数可以指定绘图对象的宽度和高度,单位为英寸,一英寸=80px
plt.figure(figsize=(8,4))
#在当前绘图对象中画图(x轴,y轴,给所绘制的曲线的名字,画线颜色,画线宽度)
plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)

plt.xlabel("Time(s)") #X轴的文字
plt.ylabel("Volt") #Y轴的文字
plt.title("PyPlotFirstExample") #图表的标题
plt.ylim(-1.2,1.2) #Y轴的范围
plt.legend() #显示图示
plt.show() #显示图
plt.savefig("sinx.png") #保存图

1552288935729

折线图

import numpy as np
import matplotlib.pyplot as plt

# X轴,Y轴数据
x = [0, 1, 2, 3, 4, 5, 6]
y = [0.3, 0.4, 2, 5, 3, 4.5, 4]
plt.figure(figsize=(8, 4))  #创建绘图对象
plt.plot(x, y, "b--", linewidth=1)  #在当前绘图对象绘图(X轴,Y轴,蓝色虚线,线宽度)
plt.xlabel("Time(s)")  #X轴标签
plt.ylabel("Volt")  #Y轴标签
plt.title("Line plot")  #图标题
plt.show()  #显示图
plt.savefig("line.png") #保存图

1552288636104

import matplotlib.pyplot as plt
import numpy as np

# 绘制普通图像
x = np.linspace(-1, 1, 50)
y1 = 2 * x + 1
y2 = x**2

plt.figure()
# 在绘制时设置lable, 逗号是必须的
l1, = plt.plot(x, y1, label = 'line')
l2, = plt.plot(x, y2, label = 'parabola', color = 'red', linewidth = 1.0, linestyle = '--')

# 设置坐标轴的取值范围
plt.xlim((-1, 1))
plt.ylim((0, 2))

# 设置坐标轴的lable
plt.xlabel('X axis')
plt.ylabel('Y axis')

# 设置x坐标轴刻度, 原来为0.25, 修改后为0.5
plt.xticks(np.linspace(-1, 1, 5))
# 设置y坐标轴刻度及标签, $$是设置字体
plt.yticks([0, 0.5], ['$minimum$', 'normal'])

# 设置legend
plt.legend(handles = [l1, l2,], labels = ['a', 'b'], loc = 'best')
plt.show()

1552292227222

创建多个图像

import numpy as np
import matplotlib.pyplot as plt

# figure的使用
x = np.linspace(-1, 1, 50)
y1 = 2 * x + 1

# figure 1
plt.figure()
plt.plot(x, y1)


# figure 2
y2 = x**2
plt.figure()
plt.plot(x, y2)


# figure 3,指定figure的编号并指定figure的大小, 指定线的颜色, 宽度和类型
y2 = x**2
plt.figure(num = 5, figsize = (4, 4))
plt.plot(x, y1)
plt.plot(x, y2, color = 'red', linewidth = 1.0, linestyle = '--')
plt.show()

1552292623335

1552292630446

1552292638667

设置坐标轴

import matplotlib.pyplot as plt
import numpy as np

# 绘制普通图像
x = np.linspace(-3, 3, 50)
y = 2 * x + 1

plt.figure()
plt.plot(x, y)

# 将上、右边框去掉
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

# 设置x轴的位置及数据在坐标轴上的位置
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
# 设置y轴的位置及数据在坐标轴上的位置
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))

# 设置坐标轴label的大小,背景色等信息
for label in ax.get_xticklabels() + ax.get_yticklabels():
    label.set_fontsize(12)
    label.set_bbox(dict(facecolor = 'green', edgecolor = 'None', alpha = 0.7))

plt.show()

1552292775857

在图表中显示中文

matplotlib的缺省配置文件中所使用的字体无法正确显示中文。为了让图表能正确显示中文,可以有几种解决方案。

  1. 在程序中直接指定字体。
  2. 在程序开头修改配置字典rcParams。
  3. 修改配置文件。

上面那个link里的修改matplotlibrc方式,我试了好几次都没成功。能work的一个比较简便粗暴的方式(但不知道有没有副作用)是,1.找到字体目录YOURPYTHONHOME\Lib\site-packages\matplotlib\mpl-data\fonts\ttf下的Vera.ttf。这里我们用中文楷体(可以从windows/system32/fonts拷贝过来,对于win8字体文件不是ttf的可以从网上下一个微软雅黑),直接张贴到前面的ttf目录下,然后更名为Vera.ttf。2. 中文字符串用unicode格式,例如:u''测试中文显示'',代码文件编码使用utf-8 加上" # coding = utf-8 "一行。

函数

常用函数

函数 功能
plt.plot 画图
plt.xlabel x轴标签
plt.ylabel y轴标签
plt.title 标题
plt.show 显示图像
plt.savefig 保存图像
plt.figure 创建一个图像窗口
plt.xlim x轴的范围
plt.ylim y轴的范围
np.linspace 定义刻度

plot

用途:

用来画图的,plt.plot()实际上会通过plt.gca()获得当前的Axes对象ax,然后再调用ax.plot()方法实现真正的绘图。

用法:

plot(x, y, 'bo-') #蓝色圆点实线
plot(x,y2,color='green', marker='o', linestyle='dashed', linewidth=1, markersize=6)
plot(x,y3,color='#900302',marker='+',linestyle='-')
plot(x, y) #plot x, y使用默认的线条样式和颜色
plot(x, y, 'bo') #plot x,y用蓝色圆圈标记
plot(y) #plot y用x作为自变量
plot(y, 'r+') #同上,但是是用红色作为标记
a.plot(x1, y1, 'g^', x2, y2, 'g-')

参数:

class matplotlib.lines.Line2D(xdata, ydata, linewidth, linestyle, color, marker, markersize)
matplotlib.pyplot.plot(*args, **kwargs)
plot([x], y, [fmt], data=None, **kwargs) #单条线:
plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs) #多条线一起画

可选参数[fmt] 是一个字符串来定义图的基本属性如:颜色(color),点型(marker),线型(linestyle),

具体形式 fmt = '[color][marker][line]'

fmt接收的是每个属性的单个字母缩写,例如:

plot(x, y, 'bo-')  #蓝色圆点实线

若属性用的是全名则不能用fmt参数来组合赋值,应该用关键字参数对单个属性赋值如:

plot(x,y2,color='green', marker='o', linestyle='dashed', linewidth=1, markersize=6)
plot(x,y3,color='#900302',marker='+',linestyle='-')

参数详解:

color
character color 颜色
b blue
g green 绿
r red
c cyan
m magenta 品红
y yellow
k black
w white
linestyle
character 线性
- 实线
- - 虚线
-. 点画线
点虚线
.
, 像素
o 圆形
v 朝下的三角形
^ 朝上的三角形
< 朝左的三角形
> 朝右的三角形
| 垂直线形
_ 水平线形
marker
character 描述
s 正方形
p 五角星
* 星型
h 1号六角形
H 2号六角形
+ +号标记
x x号标记
D 钻石形
d 小版钻石形
1 tri_down marker
2 tri_up marker
3 tri_left marker
4 tri_right marker

legend

用途:

用法:

参数:

subplot

用途:

将多个图片合并显示

用法:

subplot将整个绘图区域等分为 numRows行* numCols列 个子区域,然后按照从左到右,从上到下的顺序对每个子区域进行编号,左上的子区域的编号为1。如果numRows,numCols和plotNum这三个数都小于10的话,可以把它们缩写为一个整数,例如subplot(323)和subplot(3,2,3)是相同的。subplot在plotNum指定的区域中创建一个轴对象。如果新创建的轴和之前创建的轴重叠的话,之前的轴将被删除。

subplot()返回它所创建的Axes对象,我们可以将它用变量保存起来,然后用sca()交替让它们成为当前Axes对象,并调用plot()在其中绘图。

参数:

subplot(numRows, numCols, plotNum)

例子

import numpy as np
import matplotlib.pyplot as plt

plt.figure(1)  # 创建图表1
plt.figure(2)  # 创建图表2
ax1 = plt.subplot(211)  # 在图表2中创建子图1
ax2 = plt.subplot(212)  # 在图表2中创建子图2
x = np.linspace(0, 3, 100)

for i in range(5):
    plt.figure(1)# 选择图表1
    plt.plot(x, np.exp(i * x / 3))
    plt.sca(ax1) #选择图表2的子图1
    plt.plot(x, np.sin(i * x))
    plt.sca(ax2)  #选择图表2的子图2
    plt.plot(x, np.cos(i * x))
plt.show()

1552293096560

1552293108152

参考文献

https://blog.csdn.net/quincuntial/article/details/70947363

https://www.cnblogs.com/wei-li/archive/2012/05/23/2506940.html

posted @ 2019-03-11 16:44  hello.world!  阅读(390)  评论(0编辑  收藏  举报