内容目录
原文链接: http://www.juzicode.com/data-visualize-matplotlib-basis-plot/
在做数据处理时用图形显示出处理结果,可以得到更直观的判断。Python中matplotlib为我们提供了非常强大的绘图功能,它可以绘制曲线图、柱图、饼图、散点图、三维图等等。在python3.8及以下版本中matplotlib不是标准库,需要先通过pip安装matplotlib:
pip install matplotlib
先从一段最简单的画图代码开始,看下使用matplotlib的基本步骤,这里用到了numpy生成坐标数据,另外一般约定matplotlib.pyplot导入的别名为plt,下文出现的plt一般都是指matplotlib.pyplot:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1,20) #用numpy生成x坐标点
y = x+5 #生成y坐标的值
plt.title("juzicode")#设置标题
plt.xlabel("x") #设置x坐标标签
plt.ylabel("y=x+5") #设置y坐标标签
plt.plot(x,y) #绘图
plt.savefig('matplot-basic.png')#保存图片
plt.show() #显示图片
从前面的代码可以看出matplotlib绘图的基本过程:先利用numpy生成x,y坐标的数据,当然也可以用其他方法生成x,y坐标的数据,比如说从csv或者excel表格中读出数据,然后用plt.title()设置标题,plt.xlabel()、 plt.ylabel()设置x、y坐标的标签,再用plt.plot()方法绘图,plt.savefig()保存图片(可选项),plt.show()显示图片。
1、 绘图plot()
上面的例子是一个简单的函数关系y=x+5,x的取值是1~19的19个离散数字点,x坐标表示的就是这19个离散点的值,在plot()方法中没有指定线条格式,会使用默认方式自动填充19个y点之间的连线,所以看起来就好像连续的线条。
plot()方法的调用形式有2种:
plot([x], y, [fmt], *, data=None, **kwargs)
plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)
1.1、x、y
x、y分别为水平方向和垂直方向的取值。
1.2、fmt 线条格式
plt.plot()的第3个入参为线条样式参数:
plt.plot(x,y,'^-r')
采用的字符串含义分为3部分 :
fmt = '[marker][line][color]'
比如使用’^-r’表示用朝上三角形、连续线条、红色。如果没有给样式的说明,在内部有一个“style circle” ,供plot循环选择使用。有一个例外情况,如果line给出了说明,但是marker没有给出说明,marker不会使用。
理论上顺序可以更换,比如可以使用’ [color] [marker][line]’ ,但是最好和官方给出的要求保持一致。
三种样式参数定义:
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 |
'|' | vline marker |
'_' | hline marker |
Line Styles (风格)
符号 | 含义 |
---|---|
'-' | solid line style |
'--' | dashed line style |
'-.' | dash-dot line style |
':' | dotted line style |
Colors (颜色)
颜色只能用单个字符表示。
符号 | 含义 |
---|---|
'b' | blue |
'g' | green |
'r' | red |
'c' | cyan |
'm' | magenta |
'y' | yellow |
'k' | black |
'w' | white |
下面是一个生成不同样式子图的例子:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1,20) #用numpy生成x坐标点
y = x*x #生成y坐标的值
plt.subplot(221)
plt.title("juzicode")#设置标题
plt.plot(x,y,'*--g') #绘图
plt.subplot(222)
plt.plot(x,y,'o-r')
plt.subplot(223)
plt.plot(x,y,'<:b')
plt.subplot(224)
plt.plot(x,y,'>-y')
plt.show() #显示图片
在plt.plot()入参中连续输入多组x,y,fmt,比如plt.plot(x,y,’*–g’,x,y2,’o-r’,x,y3,'<:b’),可以在一个画布中绘制多条曲线:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1,10) #用numpy生成x坐标点
y = x*x #生成y坐标的值
y2 = 2*x + 3
y3 = -x*x - 5
plt.title("juzicode")#设置标题
plt.plot(x,y,'*--g',x,y2,'o-r',x,y3,'<:b') #绘图
plt.show() #显示图片
2、设置title、label
plt.title()设置显示图像的标题,如果显示中文默认的方法会出现乱码,参照Python数据可视化~matplot默认配置修改(可解决中文、负号等显示问题)修改可以解决乱码问题。
plt.xlabel(),plt.ylabel() 用来设置x和y轴的标签。
3、 保存、显示图像
plt.savefig(文件名称)保存用plot()方法绘制的图像。
plt.show(),显示plot()方法绘制的图像。
4、legend (图例)
legend的入参fontsize选项有 ‘xx-small’, ‘x-small’, ‘small’, ‘medium’, ‘large’, ‘x-large’, ‘xx-large’ ,类似衣服的 2个x小码、1个x小码,小码,中码……
loc是位置选项,‘best’自动选择,‘upper center’正中等等,既可以用str类型的位置字符串,也可以用int型的位置码:
位置字符串 | 位置码 | |
---|---|---|
‘best’ | 0 | 自动选择最佳位置 |
‘upper right’ | 1 | 右上 |
‘upper left’ | 2 | 左上 |
‘lower left’ | 3 | 左下 |
‘lower right’ | 4 | 右下 |
‘right’ | 5 | 正右 |
‘center left’ | 6 | |
‘center right’ | 7 | |
‘lower center’ | 8 | |
‘upper center’ | 9 | |
‘center’ | 10 |
legend()方法可以用于plt,也可用于plt.subslots()生成的ax实例。
import matplotlib.pyplot as plt
import numpy as np
if __name__ == '__main__':
plt.rc('font',family='SimSun',size='9')
plt.rc('axes',unicode_minus='False')
x = np.arange(20)
y = np.sin(x / 2)
plt.step(x, y + 2, label='pre')#默认where='pre' #step画图方式
plt.plot(x, y + 2, 'o--', color='green', alpha=0.3) #plot 画图方式
plt.step(x, y + 1, where='mid', label='mid')
plt.plot(x, y + 1, '*--', color='red', alpha=0.3)
plt.step(x, y, where='post', label='post')
plt.plot(x, y, '<--', color='blue', alpha=0.3)
plt.grid(axis='both', color='0.8')#axis可以为'x','y','both'三种
plt.legend(title='参数where:',fontsize='xx-small',loc='upper center')
plt.title('step画图 By 桔子code')
plt.show()
推荐阅读: 编码: 一个隐藏了30多年的bug,Windows含蓄说过某通不行? Python进阶--多线程通信 zbar:给我来10G打码图片 用你的邮箱为你看家护院 好冷的Python-- if __name__==’__main__’是啥东东 Python混合编程:C语言接口ctypes(1) 如何优雅地解决matplotlib不能正常显示中文和负号的问题