matplotlib用面向对象的思维来编写数据可视化中的折线图,柱形图和堆积柱形图,条形图和堆积条形图,堆积面积图,直方图,饼图和圆环图,散点图和气泡图,箱型图,雷达图,误差棒图

matplotlib 有两种接口:一个是基于 MATLAB ,另一个是基于面向对象。基于 MATLAB 的是 pyplot 提供的,比较简单,但容易混乱;基于面向对象的方法结构清晰,是matplotlib 的精髓。

基于 MATLAB 的:自动创建和管理图和坐标系,用 pyplot 函数作图

基于面向对象的:显示创建图和坐标系,再调用对象的方法来作图

使用面向对象接口时,正确的作图流程应该是:

1.创建 Figure 实例

创建实例时,可传入的参数有:num,figsize,dpi,facecolor,linewidth,edgecolor,frameon

参数的作用:

num:图形唯一的标识符,一般用不到

figsize:画布的大小,(width,height)以元组的形式传参,默认是(6.4,4.8),单位inches(英尺)

dpi:图像分辨率 

facecolor:背景色,是指画布底下图层的颜色,默认是白色

linewidth:画布边框的宽度,默认是0,表示无宽度

edgecolor:边框的颜色,使用这个参数时,需使用linewidth这个参数

frameon:默认值为Ture,表示有边框;若为False,则表示无边框

2.在 Figure 上创建 Axes

add_subplot()可传入的参数有:nrows,ncols,plot_number

nrow:表示将画布分成nrows行

ncols:表示将画布分成ncols列

nrow和ncols表示将画布分成(nrow*cols)块区域

plot_number:表示将当前对象定义到第plot_number个子区域

3.在 Axes 上添加基础类对象

基础类对象有:plot()折线图,bar()柱状图和堆积柱状图,barh()条形图和堆积条形图,stackplot()堆积面积图,hist()直方图,pie()饼图和圆环图,scatter()散点图和气泡图,boxplot()箱型图,polar()雷达图也叫极区图,errorplot()误差棒图

面向对象主要步骤:1.导入模块2.创建画布3.在画布上添加绘图区域4准备数据5..调用绘图方法绘制图表6.展示图表

注意:以下参数带有[],即[参数],表示可选,非必要


折线图

语法:

plot(*args, scalex=True, scaley=True, data=None, **kwargs)

简化后:

单线条:plot([x], y, [fmt], data=None, **kwargs)

多线条:plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)

参数说明:

[x]:可选,表示x轴数据

y:必选,表示y轴数据

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


color(颜色)


颜色单词                             中文                             简写

blue                                     蓝色                             'b'

green                                   绿色                            'g'

red                                       红色                            'r'

cyan                                    蓝绿色                         'c'

magenta                              洋红色                        'm' 

yellow                                  黄色                            'y'

black                                   黑色                            'b'

while                                   白色                            'w'

其实简写就是颜色单词的首字母,从传参时可以这样传color='blue',也可以color='b',还可以关键字参数color赋十六进制的字符串如 color='#900302',也可以用RGB


linestyle(线型)


简写                        名字                                       中文

 '-'                            solid line style                       实线
 '--'                           dashed line style                   虚线
 '-.'                           dash-dot line style                点画线
 ':'                            dotted line style                    点线

需要注意的是,在给marker传值时只能传简写,而不能传名字


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


color参数,marker参数,linestyle参数可以搭配使用,使用关键字传参'[颜色][线型][点型]',也可以使用位置参数color='r,linestyle='-',marker='.'



折线图
 

# 1.导入模块
import matplotlib.pyplot as plt
import numpy as np
# 2.创建画布
fig = plt.figure()      # figure类的对象
# 3.在画布上添加绘图区域
ax = fig.add_subplot(111)
# 准备数据
x_data = np.array([1,2,3,4,5])       
y_data = np.array([6,5,5,7,4])
# 4.调用绘图方法绘制图表
ax.plot(x_data,y_data)
# 5.展示图表
plt.show()

# 通过面向对象的方式绘制图表
# 1.导入模块
import matplotlib.pyplot as plt
import numpy as np

# 2.创建画布
# Figure类的对象
fig = plt.figure(figsize=(7, 5), facecolor='#BBFFFF', linewidth=5, edgecolor='r')  

# 3.在画布上添加绘图区域
ax1 = fig.add_subplot(121)
ax2 = fig.add_subplot(122)

# 准备数据
x1_data = np.array([1, 2, 3, 4, 5])
y1_data = np.array([6, 5, 5, 7, 4])

x2_data = np.array([1, 2, 3])
y2_data1 = np.array([4, 5, 6])
y2_data2 = np.array([7, 8, 9])
y2_data3 = np.array([10, 11, 12])
# 4.调用绘图方法绘制图表
ax2.plot(x2_data, y2_data1, 'r--+')
ax2.plot(x2_data, y2_data2, 'y-.o')
ax2.plot(x2_data, y2_data3, 'g-|')
ax1.plot(x1_data, y1_data, 'b:v')
# 5.展示图表
plt.show()


柱状图和堆积柱状图


语法:

bar(x, height, width=0.8, bottom=None, *, align=‘center’, data=None, **kwargs)

参数说明:

x: 表示x坐标,数据类型为int或float类型,x可以为字符串数据。
height: 表示柱状图的高度,也就是y坐标值,数据类型为int或float类型。
width: 表示柱状图的宽度,取值在0~1之间,默认为0.8。
bottom: 柱状图的起始位置,也就是y轴的起始坐标。
align: 柱状图的对齐方式,默认为’center’表示以x坐标为中心,‘edge’表示将条形的左边缘与x对齐。

color: 柱状图颜色
edgecolor: 边框颜色
linewidth: 边框宽度
tick_label :下标标签

堆积柱状图其实就是使用bottom参数,并传入前一组数据的height(即y轴数据)作为bottom的参数值


import matplotlib.pyplot as plt
import numpy as np

柱状图
# 创建画布
fig = plt.figure()

# 在画布上添加绘图区域
ax = fig.add_subplot(111)

# 调用绘图方法绘制图表
# 数据准备
x_data = np.arange(0,11)
y_data = np.random.random(11)
ax.bar(x_data,y_data)

# 展示图表
plt.show()

堆积柱状图
import matplotlib.pyplot as plt 
import numpy as np

# 创建画布
fig = plt.figure()
# 在画布上添加绘图区域
ax = fig.add_subplot(111)

# 数据准备
x_data = np.arange(5)
y_data1 = np.array([13,14,7,8,5])
y_data2 = np.array([12,10,9,6,7])
error = [2,3.4,0.3,4,1]       # 误差数据

width = 0.3
color = ['g','b']
# 调用绘图方法绘制图表
ax.bar(x_data,y_data1,width=width)
ax.bar(x_data,y_data2,width=width,bottom=y_data1)
# 展示图表
plt.show()


条形图和堆积条形图


官方语法

barh(y, width,height=0.8,left=None,align='center',*,**kwargs)

参数说明:

y:表示条形的y坐标值。

width:表示条形的宽度。

height:表示条形的高度,默认值为0.8。

left:条形左侧的×坐标值,默认值为0。

Ialign:表示条形的对齐方式,默认值为“center”,即条形与刻度线居中对齐。

tick label:表示条形对应的刻度标签。

xerr, yerr:若未设为None,则需要为条形图添加水平/垂直误差棒。
barh ()函数会返回一个BarContainer类的对象。


条形图
import matplotlib.pyplot as plt
import numpy as np


# 创建画布
fig = plt.figure()
# 在画布上添加绘图区域
ax = fig.add_subplot(111)

# 准备数据
height = 0.4
y = np.arange(5)
x1 = np.array([29,31,44,63,53])

# 调用绘图方法绘制图表
ax.barh(y,x1,height=height)

# 展示图表
plt.show()

堆积条形图
import matplotlib.pyplot as plt
import numpy as np

# 创建画布
fig = plt.figure()

# 在画布上添加绘图区域
ax = fig.add_subplot(111)
# 调用绘图方法绘制图表
# 准备数据
y = np.arange(5)
x1 = np.array([29, 31, 44, 63, 53])
x2 = np.array([28, 35, 49, 57, 58])

height = 0.3
ax.barh(y, x1, height)
ax.barh(y + height, x2, height, tick_label=['a', 'b', 'c', 'd', 'e'])
# 展示图表
plt.show()


堆积面积图


官方语法:

stackplot(x,y,labels=0,baseline='zero', data=None,*args,**kwargs)

参数说明:
x:表示x轴的数据,可以是一维数组。
y:表示y轴的数据,可以是二维数组或一维数组序列。
labels: 表示每个填充区域的标签。
baseline: 表示计算基线的方法,包括zero、sym、wiggl和weighted wiggle.
其中zero表示恒定零基线,即简单的叠加图;sym表示对称于零基线;wiggle表示最小化平方斜率之和;weighted_wiggle表示执行相同的操作,但权重用于说明每个填充区域的大小。


堆积面积图
# 创建画布
fig = plt.figure()
# 在画布上添加绘图区域
ax = fig.add_subplot(111)
# 调用绘图方法绘制图表
# 准备数据
x = np.arange(6)
y1 = np.array([1,4,3,5,6,7])
y2 = np.array([1,3,4,2,7,6])
y3 = np.array([3,4,3,6,5,5])
# 调用绘图方法绘制图表
ax.stackplot(x,y1,y2,y3)
# 展示图表
plt.show()


直方图


语法:

hist(x,bins=None, range=None, density=None,weights=None,bottom=None, **kwargs)

参数说明:
x:表示传入的数据,可以是一个数组或包含多个数组的序列。
bins: 表示矩形条的个数,默认值为10。
range: 表示数据的范围,若未设置范围,默认数据范围为(x.minO,x.max())。cumulative:表示是否计算累计频数或频率。
histtype:表示直方图的类型,支持'bar'、'barstacked'、'step'、stepfilled‘四种取值,其中'bar'为默认值,代表传统的直方图;barstacked'代表堆积直方图;'step'代表未填充的线条直方图;stepfilled'代表填充的线条直方图。


import matplotlib.pyplot as plt
import numpy as np

直方图
# 创建画布
fig = plt.figure()
# 在画布上添加绘图区域
ax = fig.add_subplot(111)
# 调用绘图方法绘制图表
# 准备数据
data = np.random.randint(0,101,50)
ax.hist(data,bins=8,histtype='stepfilled')
# 展示图表
plt.show()


饼图或圆环图


语法:
pie(x,explode=None, labels=None, autopct=None,pctdistance=0.6,startangle=None, *, data=None)


参数说明:
x:表示扇形或楔形对应的数据。
explode:表示扇形或楔形离开中心的距离。
labels:表示每个扇形或楔形对应的标签文本。
autopct:表示控制扇形或楔形的数值显示的字符串,可通过格式字符串指定小数点后的位数。
pctdistance:表示扇形或楔形对应的数值标签距离圆心的比例,默认为0.6。
shadow:表示是否显示阴影。
labeldistance:表示标签文本的绘制位置(相对于半径的比例),默认为1.1。



饼图
import matplotlib.pyplot as plt
import numpy as np


# 创建画布
fig = plt.figure()
# 在画布上添加绘图区域
ax = fig.add_subplot(111)

# 准备数据
data = np.array([20, 50, 10, 15, 30, 55])
pie_labels = np.array(['A', 'B', 'C', 'D', 'E', 'F'])
explode_position = [0.05, 0.05, 0.05, 0.05, 0.05, 0.05]
# 调用绘图方法绘制图表
ax.pie(data, explode=explode_position, radius=1, labels=pie_labels, autopct='%3.1f%%',shadow=True)
# 展示图表
plt.show()

圆环图
import matplotlib.pyplot as plt
import numpy as np
# 创建画布
fig = plt.figure()
# 在画布上添加绘图区域
ax  = fig.add_subplot(111)
# 准备数据
data = np.array([20, 50, 10, 15, 30, 55])
pie_labels = np.array(['A', 'B', 'C', 'D', 'E', 'F'])
# 调用绘图方法绘制图表
ax.pie(data,labels=pie_labels,wedgeprops={'width':0.6},autopct='%3.1f%%',pctdistance=0.75)
# 展示图表
plt.show()


散点图和气泡图


官方语法:
scatter(x,y, s=None, c=None,marker-None, cmap=None,linewidths语法None,edgecolors=None,*,**kwargs)
参数说明:
x,y:表示数据点的位置。
s:表示数据点的大小。
c:表示数据点的颜色。
marker:表示数据点的样式,默认值是‘o‘,表示圆形。
alpha:表示透明度,可以取值为0~1。
linewidths:表示数据点的描边宽度,默认值是1.5。
edgecolors:表示数据点的描边颜色


散点图
import matplotlib.pyplot as plt
import numpy as np

# 创建画布
fig = plt.figure()
# 在画布上添加绘图区域
ax = fig.add_subplot(111)
# 准备数据
num = 50
x_data = np.random.rand(num)
y_data = np.random.rand(num)
# 调用绘图方法绘制图表
ax.scatter(x_data,y_data)
# 展示图表
plt.show()

气泡图
import matplotlib.pyplot as plt 
import numpy as np
# 创建画布
fig = plt.figure()
# 在画布上添加绘图区域
ax = fig.add_subplot(111)
# 准备数据
num = 50
x_data = np.random.rand(num)
y_data = np.random.rand(num)
area = (30*np.random.rand(num))**2
# 调用绘图方法绘制图表
ax.scatter(x_data,y_data,area)
# 展示图表
plt.show()


箱型图


官方语法:
boxplot(x,notch=None, sym=None,vert=None,whis=None, position语法=None, widths=None,*, data=None)

参数说明:
x:绘制箱形图的数据。
sym:表示异常值对应的符号,默认为空心圆圈。
vert: 表示是否将箱体垂直摆放,默认值是True,表示垂直摆放。
whis: 表示箱形图上下须与上下四分位的距离,默认为1.5倍的四分位差。
positions: 表示箱体的位置。
widths: 表示箱体的宽度,默认为0.5。
patch artist:表示是否填充箱体的颜色,默认不填充。
meanline:是否用横跨箱体的线条标出平均数,默认不使用。
showcaps: 表示是否显示箱体顶部和底部的横线,默认显示。
showbox: 表示是否显示箱形图的箱体,默认显示。
showfliers: 表示是否显示异常值,默认显示。
labels: 表示箱形图的标签。
boxprops: 表示控制箱体属性的字典。


import matplotlib.pyplot as plt
import numpy as np

# 显示中文
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False

# 创建画布
fig = plt.figure()
# 在画布上添加绘图区域
ax = fig.add_subplot(111)
# 准备数据
data_2018 = np.array([5200, 5254.5, 5283.4, 5107.8, 5443.3, 5550.6,
                      6400.2, 6404.9, 5483.1, 5330.2, 5543, 6199.9])
data_2017 = np.array([4605.2, 4710.3, 5168.9, 4767.2, 4947, 5203, ])
# 调用绘图方法绘制图表
ax.boxplot([data_2018, data_2017], labels=['2018年', '2017年'], patch_artist=True,widths=0.3, vert=False)
# 展示图表
plt.show()


雷达图


官方语法:
polar(theta,r,**kwargs)

参数说明:
theta:表示每个数据点所在射线与极径的夹角,单位是弧度。
r:表示每个数据点到极点的距离。


# 面向对象绘制极坐标图
import matplotlib.pyplot as plt
import numpy as np
N = 20
theta = np.linspace(0, 2 * np.pi, N, endpoint=False)  # 均分角度
radii = 10 * np.random.rand(N)  # 随机角度
width = np.pi / 4 * np.random.rand(N)  # 随机宽度
# 极坐标图绘制
ax = plt.subplot(111, projection='polar')  
# 哪个角度画,长度,扇形角度,从距离圆心0的地方开始画
bars = ax.bar(theta, radii, width=width, bottom=0.0)  
for r, bar in zip(radii, bars):
    bar.set_facecolor(plt.cm.viridis(r / 10.0))
    bar.set_alpha(0.5)  # 添加颜色
plt.title('polar')
plt.show()


误差棒图 


官方语法:
errorbar(x,y, yerr=None,xerr=None, fmt=",ecolor=None,*,data=N
ne,**kwargs)

参数说明:
x,y:表示数据点的位置。
xerr,yerr:表示数据的误差范围。
fmt:表示数据点的标记样式和数据点之间连接线的样式。
elinewidth:表示误差棒的线条宽度。
capsize:表示误差棒边界横杆的大小。
capthick:表示误差棒边界横杆的厚度。


import matplotlib.pyplot as plt
import numpy as np

# 显示中文
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 创建画布
fig = plt.figure()
# 在画布上添加绘图区域
ax = fig.add_subplot(111)
# 准备数据
# 准备 x 轴和 y 轴的数据
x = np.arange(3)
y1 = np.array([2.04, 1.57, 1.63])
y2 = np.array([1.69, 1.61, 1.64])
y3 = np.array([4.65, 4.99, 4.94])
y4 = np.array([3.39, 2.33, 4.10])
# 指定测量偏差
error1 = [0.16, 0.08, 0.10]
error2 = [0.27, 0.14, 0.14]
error3 = [0.34, 0.32, 0.29]
error4 = [0.23, 0.23, 0.39]
bar_width = 0.2
# 调用绘图方法绘制图表
width = 0.2
ax.bar(x, y1,width=bar_width)
ax.bar(x+width, y2,align='center',tick_label=['春季','夏季','秋季'],width=bar_width)
ax.bar(x+2*width, y3,width=bar_width)
ax.bar(x+3*width, y4,width=bar_width)
# 添加误差棒
ax.errorbar(x,y1,yerr=error1,capsize=4,capthick=1,fmt='k,')
ax.errorbar(x+width,y2,yerr=error2,capsize=4,capthick=1,fmt='k,')
ax.errorbar(x+2*width,y3,yerr=error3,capsize=4,capthick=1,fmt='k,')
ax.errorbar(x+3*width,y4,yerr=error4,capsize=4,capthick=1,fmt='k,')
# 展示图表
plt.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Life City

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值