数据可视化~matplotlib基本绘图方法

原文链接:http://www.juzicode.com/archives/2455

在做数据处理时用图形显示出处理结果,可以得到更直观的判断。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不能正常显示中文和负号的问题 

发表评论

电子邮件地址不会被公开。 必填项已用*标注