欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

2-Matplotlib教程

程序员文章站 2022-03-26 19:19:58
...

1.matplotlib

import matplotlib.pyplot as plt
figure=plt.figure(figsize=(10,6))

plt.subplot(221) # 子图

plt.grid() # 网格

plt.axis([-1,8,-2,2]) # 坐标范围,x,y一起设置或者plt.xlim([-1,8]),plt.ylim([1,2])

plt.plot(x,y,x1,y1,label='sin(x)') # 画图,画在离它最近的画布上去

plt.xlabel("data"
           #,color='blue'
           #, rotation=90
           #, fontdict={"fontsize":30}
          ) # x轴的标签,纵轴标签默认是90°
plt.ylabel("value") # y轴的标签

plt.xticks([0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi]) # x轴刻度,最好设置在显示的范围内
plt.xticks([0,1,2,3,4],["lucy","tom","jack","mery","lilei"],fontdict={
    "color":"green",
    "fontsize":15,
    "rotation":20 #旋转角度
}) # 替换掉原有的刻度

plt.title("SIN",loc="left", rotation=30, fontsize=20) # 设置标题

plt.legend(loc=10) # 设置图例,位置0~10

plt.subplot(224) # 子图
plt.show() # 代表一个画板画图结束

figure.savefig('sin.png') # 保存图片


1.直方图
plt.hist(df.people,bins=8)
df.people.plot(kind='hist',bins=8)

2.柱状图
plt.bar(df.country,df.people,color=np.random.random((4,3)))
df.people.plot(kind='bar',color=np.random.random((4,3)))

3.饼状图
plt.pie([190,60,30],labels=['A','B','C'],autopct='%2.1f')
df.people.plot(kind='pie',autopct='%2.1f')

4.散点图
plt.scatter([10,20,30], [88,30,99], marker='H',s=50, color=np.random.random((3,3)))
df.plot(kind='scatter',x='people',y='asd')

5.箱线图
plt.boxplot(np.random.randint(0,100,100))
df.people.plot(kind='box')

1.1 matplotlib基础知识

Matplotlib中的基本图表包括的元素

  • x轴和y轴 ,axis 水平和垂直的轴线

  • 轴标签 ,axisLabel 水平和垂直的轴标签

  • x轴和y轴刻度, tick 刻度标示坐标轴的分隔,包括最小刻度和最大刻度

  • x轴和y轴刻度标签, tick label 表示特定坐标轴的值

  • 绘图区域(坐标系), axes 实际绘图的区域

  • 画布 figure 呈现所有的坐标系

1.1.1 只含单一曲线

可以使用多个plot函数(推荐),在一个图中绘制多个曲线

用Series绘图:

%matplotlib inline # 不用再plt.show()即可显示图像
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False   # 步骤二(解决坐标轴负数的负号显示问题)

price = Series(data=np.random.randint(100,200, size=10), index=np.arange(10))
price.plot()

用DataFrame绘图:

prices = DataFrame(data={
    "BGY":np.random.randint(100,200,size=(10,)),
    "SMQH":np.random.randint(100,200,size=(10)),
    "LYHG":np.random.randint(100,200,size=(10))
})
prices.plot() # 一个图中有三条折线,并且含有图例(“BGY”)....

只绘制线型图:

x = np.array([1,2])
y = np.array([4,8])
plt.plot(x, y) # 一条倾斜的直线
x = np.arange(10)
y = 2*x
plt.plot(x, y) # 一条倾斜的直线

画sin函数图:

x = np.linspace(0, np.pi*2, 100)
y = np.sin(x)
# 绘制一条线 (要找到x, y之间的对应关系)
plt.plot(x, y)

绘制线型图,x必须是有序的,从小到大排序

x = np.sort(np.random.randint(0,10,size=10))
y = np.random.randint(0,10,size=10)
plt.plot(x, y) # 一条折线

也可以在一个plot函数中传入多对X,Y值,在一个图中绘制多个曲线:

# 绘制多条线
x = np.linspace(0,2*np.pi, 100)
plt.plot(x, np.sin(x))
plt.plot(x, np.cos(x)) # 一个图上有sinx、cosx图像

plt.plot(x, np.sin(x), x, np.cos(x), x, 0.5*x) # 也可以同时画

1.1.2 获取画板对象

figure语法说明

figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)

  • num:图像编号或名称,数字为编号 ,字符串为名称
  • figsize:指定figure的宽和高,单位为英寸;
  • dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80 1英寸等于2.5cm,A4纸是 21*30cm的纸张
  • facecolor:背景颜色
  • edgecolor:边框颜色
  • frameon:是否显示边框
x = np.linspace(-np.pi, np.pi, 100)
# 如果没有显示创建这个画板对象,cell中也会自动维护一个画板
figure = plt.figure(figsize=(5,2))
# 如果没有特殊的处理,一个cell中的所有图像,都默认显示在同一个画板中
plt.plot(x, np.sin(x)) # 设置此行代码之前的所有图像进行显示,如果没设置,会在cell末尾自动显示图像
plt.show()
plt.plot(x, np.cos(x)) # 先后显示两图

1.1.3 设置字画布

画板–>画布–>呈现图像

  • 画布和画板一样,如果不需要做一些额外设置,不需要显示调用它
  • 常用的操作是对画板进行分区,就要配置画布的位置
axes = plt.subplot(111) # 一行一列个画布
# 调整画布的大小,可以通过调整画板来实现
plt.figure(figsize=(10,6))
axes1 = plt.subplot(221)
# 在不同的画布中,绘制不同的图像
# 1. 上下文原则: 绘图函数会默认把图像绘制到离它最近的那个画布上去
plt.plot(x, np.sin(x))
# 2. 使用面向对象的方式绘制
axes1.plot(x, np.cos(x))
axes2 = plt.subplot(2,2,2) # 同plt.subplot(222)
axes3 = plt.subplot(2,2,3)
axes4 = plt.subplot(2,2,4) # 1行1列有sinx和cosx图像

plt.figure(figsize=(14,7))
plt.subplot(221)
plt.plot(x,np.sin(x))
plt.subplot(224)
plt.plot(x,np.cos(x)) # 2行2列,两个图在对角线

1.1.4 网格线

plt.grid() # 有网格的画板
plt.figure(figsize=(10,6))
axes1 = plt.subplot(221)
plt.grid()
axes2 = plt.subplot(2,2,2)
plt.grid(linewidth=3)

axes3 = plt.subplot(2,2,3)
# plt.grid(color='#aaffdd')
plt.grid(color=np.random.random(3))

axes4 = plt.subplot(2,2,4)
axes4.grid(axis='x', alpha=0.3, color='red') # x方向无线条
#1. HTML颜色名称(支持简称)  red blue green yellow yellowgreen purple darkgray lightgray gray 
#2. 十六进制字符串  "#00aaff" 
#3. RGB元组(0-1)float32  (0-255)uint8  np.random.random((8,3))
#   jpg代表的: 三个0-255 uint8类型的整数
#   png代表的: 三个0-1  float32类型的小数
#   retina
random_image = np.random.randint(0,255,size=(100,100,3), dtype=np.uint8)
plt.imshow(random_image)

random_image2 = np.random.random(size=(100,100,3))
random_image2.dtype

plt.imshow(random_image2)

使用plt.grid方法可以开启网格线,使用plt面向对象的方法,创建多个子图显示不同网格线

  • lw代表linewidth,线的粗细
  • alpha表示线的明暗程度
  • color代表颜色
  • axis显示轴向

1.1.5 坐标界限

plt.axis([xmin,xmax,ymin,ymax])

# 坐标轴的界限默认有图像的内容确定
x = np.linspace(0, 2*np.pi, 100)
#axes = plt.subplot(111)
#plt.axis([-1,8,-2,2]) # x,y一起设置
plt.plot(x, np.sin(x))
#axes.axis([-2,10,-3,3])
# 单独对横轴和纵轴的边界处理
plt.plot(x, np.sin(x))
plt.xlim([-1, 8])
plt.ylim([-2,2])
# 单独对横轴和纵轴的边界处理(使用set函数)
axes = plt.subplot(111)
plt.plot(x, np.sin(x))
axes.set_xlim([-1, 8])
axes.set_ylim([-2,2])
plt.axis('xxx') 'tight''off''equal'……
# 设置坐标轴类型
# 关闭坐标轴

画圆:

# plt.figure(figsize=(5,5))
x = np.linspace(-1,1, 100)
y = (1-x**2)**0.5
plt.plot(x, y)
plt.plot(x, -y)
# # 调整横纵轴的比例 equal, scaled
plt.axis('equal')
# 强制渲染前面的绘图代码
# plt.axis('off') # 两个轴是否显示
#plt.show()

xlim方法和ylim方法

除了plt.axis方法,还可以通过xlim,ylim方法设置坐标轴范围

1.1.6 坐标标签

xlabel方法和ylabel方法
plt.ylabel(‘y = x^2 + 5’,rotation = 60)旋转

  • color 标签颜色
  • fontsize 字体大小
  • rotation 旋转角度
x = np.linspace(0,2*np.pi, 100)
plt.plot(x, np.sin(x))
plt.xlabel("data"
           #,color='blue'
           #, rotation=90
           #, fontdict={"fontsize":30}
          )
# 纵轴标签默认是90°
plt.ylabel("value")
x = np.linspace(0,2*np.pi, 100)
axes = plt.subplot(111)
plt.plot(x, np.sin(x))
#面向对象的方式
axes.set_xlabel("data"
                ,color='blue'
                , rotation=90
                , fontdict={"fontsize":30}
               )
# 纵轴标签默认是90°
axes.set_ylabel("value", fontsize=20)

1.1.7 X、Y轴坐标刻度

plt.xticks()和plt.yticks()方法

  • 需指定刻度值和刻度名称 plt.xticks([刻度列表],[名称列表])
  • 支持fontsize、rotation、color等参数设置
x = np.linspace(0,2*np.pi,100)
plt.plot(x, np.sin(x))
# params1: 要保留的刻度值(最好选择在数据的有效范围之内)
plt.xticks([0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi])
plt.show()
score = np.array([98,87,59,89,100])
plt.plot(np.arange(5),score)
# params2: 刻度标签
plt.xticks([0,1,2,3,4],["lucy","tom","jack","mery","lilei"]) # 替换掉原有的刻度
plt.show()
score = np.array([98,87,59,89,100])
axes = plt.subplot(111)
plt.plot(np.arange(5),score)
# 使用画布设定刻度位置
axes.set_xticks([0,1,2,3,4])
# 使用画布设定刻度标签
axes.set_xticklabels(["lucylucylucy","tomtomtomtom","jackjackjack","merymerymery","lileilileililei"],fontdict={
    "color":"green",
    "fontsize":15,
    "rotation":20 #旋转角度
})

plt.show()
x = np.linspace(0,2*np.pi,100)
plt.plot(x, np.sin(x))
# params1: 要保留的刻度值(最好选择在数据的有效范围之内)
plt.xticks([0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi],["0","π/2","π","3π/2","2π"])
plt.yticks([-1,0,1],["min","middle","max"], fontsize=15, color='red')
plt.show()

1.1.8 画布标题

plt.title()方法

axes.set_title()

  • loc {left,center,right}
  • color 标签颜色
  • fontsize 字体大小
  • rotation 旋转角度
plt.figure(figsize=(10,3))
ax1 = plt.subplot(1,2,1)
ax1.plot(x, np.sin(x))
plt.title("SIN",loc="left", color=np.random.random(3), fontsize=20)

ax2 = plt.subplot(1,2,2)
ax2.plot(x, np.cos(x))
ax2.set_title("COS", loc='right' ,rotation=30, color='red', fontsize=20)

plt.show() # 两块画布,两个图,两个标题,两种设置方式

1.1.9 图例-legend

#【推荐】添加图例的方法
plt.plot(x, np.sin(x), label="SIN(X)")
plt.plot(x, np.cos(x), label="COS(X)")
# 开启图例,图例会显示每一个绘图(不止plot)函数中的label参数的值显示出来
plt.legend()
plt.show()
plt.plot(x, np.sin(x))
plt.plot(x, np.cos(x))
plt.legend(["SINX","COSX"])

legend方法

两种传参方法:

  • 分别在plot函数中增加label参数,再调用legend()方法显示
  • 直接在legend方法中传入字符串列表

loc参数

  • loc参数用于设置图例标签的位置,一般在legend函数内
  • matplotlib已经预定义好几种数字表示的位置
字符串 数值 字符串 数值
best 0 center left 6
upper right 1 center right 7
upper left 2 lower center 8
lower left 3 upper center 9
lower right 4 center 10
right 5
plt.plot(x, np.sin(x), label="SIN(X)")
plt.plot(x, np.cos(x), label="COS(X)")
# 开启图例,图例会显示每一个绘图(不止plot)函数中的label参数的值显示出来
# plt.legend(loc="upper right")
plt.legend(loc=10)
plt.show()

loc参数可以是2元素的元组,表示图例左下角的坐标

  • [0,0] 左下
  • [0,1] 左上
  • [1,0] 右下
  • [1,1] 右上

ncol参数

ncol控制图例中有几列,在legend中设置ncol,需要设置loc

plt.plot(x, np.sin(x), label="SIN(X)")
plt.plot(x, np.cos(x), label="COS(X)")
# 开启图例,图例会显示每一个绘图(不止plot)函数中的label参数的值显示出来
# plt.legend(loc="upper right")
plt.legend(loc=[0.8,0.4]
           , ncol=2 # 调整图例显示,并排显示
          )
plt.show()

# 图例也可以超过图的界限loc = (-0.1,0.9)

linestyle、color、marker

修改线条样式

1.1.10 保存图片

使用figure对象的savefig的函数

  • filename
    含有文件路径的字符串或Python的文件型对象。图像格式由文件扩展名推断得出,例如,.pdf推断出PDF,.png推断出PNG (“png”、“pdf”、“svg”、“ps”、“eps”……)
  • dpi
    图像分辨率(每英寸点数),默认为100
  • facecolor
    图像的背景色,默认为“w”(白色)
figure = plt.figure(figsize=(10,3), facecolor='orange')
x = np.linspace(0,2*np.pi, 100)
plt.plot(x, np.sin(x), label="SIN(X)")
plt.legend()

# 保存图片的背景色以savefig函数为准
figure.savefig('sin.png',dpi=50, facecolor='blue')

matplotlib常用的绘图元素的设置小结

  1. 画板对象 figure = plt.figuer(figsize)
  2. 画布对象 axes = plt.subplot(row, col, loc)
  3. 网格线 plt.grid() axes.grid()
  4. 轴设置、刻度标签 plt.axis([xmin, xmax, ymin, ymax]) 设置界限 plt.axis(‘equal’) 设置横纵轴比例 plt.axis(‘off’) 设置横纵轴的开启和关闭 plt.xlim() axes.set_xlim([]) plt.ylim() axes.set_ylim([])
  5. 轴标题 plt.xlabel(s, color, fontsize, rotation, fontdict) axes.set_xlabel() plt.ylabel() axes.set_ylabel()
  6. 画布标题 plt.title(s, color, fontsize, rotation, fontdict) axes.set_title(s, color, fontsize…)
  7. 刻度设置 plt.xticks([刻度值列表], [刻度标签列表]) plt.yticks([刻度值列表], [刻度标签列表])

axes.set_xticks([刻度值列表]) axes.set_xticklabels([刻度标签列表], color, fontsize…) axes.set_yticks([刻度值列表]) axes.set_yticklabels([刻度标签列表], color, fontsize…)

  1. 图例 所有的绘图函数中,都有一个参数叫label,用于接收图例标签,配合legend() plt.plot(xxx, label=“name”) plt.legend(loc, ncol, color, fontsize…)

1.2 设置plot的风格和样式

plot语句中支持除X,Y以外的参数,以字符串形式存在,来控制颜色、线型、点型等要素,语法形式为:
plt.plot(X, Y, ‘format’, …)

y = np.random.randint(10,20,size=(6))
# 画布背景色
plt.subplot(111, facecolor="yellow")
plt.plot(y, color="red", alpha=0.9, linestyle='None', marker='s')

点和线的样式

  1. 颜色:参数color或c

颜色值的方式

  • 别名

    • color=‘r’
  • 合法的HTML颜色名

    • color = ‘red’
颜色 别名 HTML颜色名 颜色 别名 HTML颜色名
蓝色 b blue 绿色 g green
红色 r red 黄色 y yellow
青色 c cyan 黑色 k black
洋红色 m magenta 白色 w white
  • HTML十六进制字符串

    • color = ‘#eeefff’
  • 归一化到[0, 1]的RGB元组

    • color = (0.3, 0.3, 0.4)
  • jpg png 区别

  1. 透明度:alpha参数
  2. 背景色:设置背景色,通过plt.subplot()方法传入facecolor参数,来设置坐标系的背景色
  3. 线型:参数linestyle或ls
线条风格 描述 线条风格 描述
‘-’ 实线 ‘:’ 虚线
‘–’ 破折线 ‘steps’ 阶梯线
‘-.’ 点划线 ‘None’ / ‘,’ 什么都不画
x = np.linspace(0,2*np.pi, 10)
style_dict = {
    "-":"-",
    "--":"--",
    "-.":"-.",
    ":":":",
    "steps":"steps",
    "None":"None"
}
def show_lines():
    padd = 0
    for key, value in style_dict.items():
        padd += 1
        y = np.sin(x+padd)
        # linestyle == ls
        # linewdith == lw
        plt.plot(x, y, linestyle=value, label=key, color=np.random.random(3), linewidth=padd)
    plt.legend()
show_lines()
  1. 线宽:linewidth或lw参数

不同宽度的破折线

dashes参数 eg.dashes = [20,50,5,2,10,5]

设置破折号序列各段的宽度

dashes = [50, 30, 100, 40, 30, 5]
plt.plot(y, dashes=dashes, color=np.random.random(3), label="salary", lw=3)
plt.legend()
  1. 点型:marker 设置点形,markersize 设置点形大小
# 图形中有点才能设置点形
# 1. 线型图
# 2. 散点图
point = np.random.randint(5,20,size=10)
color = np.random.random(3)

# marker 点型
# markersize 点的大小
# markerfacecolor 点的主体颜色, 必须有面积
# markeredgecolor 点的边线颜色
# markeredgewidth 点的边线宽度
plt.plot(point, ls='None', marker='o', markersize=20, markeredgecolor=color, markerfacecolor='white')
plt.plot(point, ls='None', marker='2', markersize=20, color=color)
plt.show()
plt.plot(point, ls='None',marker='X', markersize=20, markerfacecolor='green')
plt.plot(point, ls='None',marker='|', markersize=40, markeredgecolor='green', markeredgewidth=5)
标记 描述 标记 描述
‘1’ 一角朝下的三脚架 ‘3’ 一角朝左的三脚架
‘2’ 一角朝上的三脚架 ‘4’ 一角朝右的三脚架
标记 描述 标记 描述
‘s’ 正方形 ‘p’ 五边形
‘h’ 六边形1 ‘H’ 六边形2
‘8’ 八边形
标记 描述 标记 描述
‘.’ ‘x’ X
‘*’ 星号 ‘+’ 加号
‘,’ 像素
标记 描述 标记 描述
‘o’ 圆圈 ‘D’ 菱形
‘d’ 小菱形 ‘’,‘None’,’ ',None
标记 描述 标记 描述
‘_’ 水平线 ‘|’ 竖线
标记 描述 标记 描述
‘v’ 一角朝下的三角形 ‘<’ 一角朝左的三角形
‘^’ 一角朝上的三角形 ‘>’ 一角朝右的三角形

多参数连用

颜色、点型、线型,可以把几种参数写在一个字符串内进行设置 ‘r-.o’

# plt.plot(x, y, color, ls, lw, marker, markersize...)
# plt.plot(x1,y1, x2, y2, color, ls......)
# plt.plot(x1, y1, 'formatstring')

x = np.linspace(0, 2*np.pi, 20)
plt.plot(x, np.sin(x),'r--o', x, np.cos(x),'g-.s')
# 线和点的风格设置会影响到图例显示
plt.legend(["sin(x)", "cos(x)"])
plt.show()

更多点和线的设置

  • markeredgecolor = ‘green’,
  • markeredgewidth = 2,
  • markerfacecolor = ‘purple’
参数 描述 参数 描述
color或c 线的颜色 linestyle或ls 线型
linewidth或lw 线宽 marker 点型
markeredgecolor 点边缘的颜色 markeredgewidth 点边缘的宽度
markerfacecolor 点内部的颜色 markersize 点的大小
多个曲线同一设置

属性名声明,不可以多参数连用

plt.plot(x1, y1, x2, y2, fmt, …)

多个曲线不同设置

多个都进行设置时,多参数连用 plt.plot(x1, y1, fmt1, x2, y2, fmt2, …)

三种设置方式

向方法传入关键字参数
  • import matplotlib as mpl
对实例使用一系列的setter方法
  • plt.plot()方法返回一个包含所有线的列表,设置每一个线需要获取该线对象
    • eg: lines = plt.plot(); line = lines[0]
    • line.set_linewith()
    • line.set_linestyle()
    • line.set_color()
对坐标系使用一系列的setter方法
  • axes = plt.subplot()获取坐标系
    • set_title()
    • set_facecolor()
    • set_xticks、set_yticks 设置刻度值
    • set_xticklabels、set_yticklabels 设置刻度名称
# 绘图元素主要对画布
axes = plt.subplot(111)
axes.set_title("AXES-TITLE")

line1, line2 = plt.plot(x, np.sin(x), x, np.cos(x))

# line1.color = "red"
line1.set_color("red")
line1.set_linewidth(3)
line1.set_marker('h')
line1.set_markersize(15)

line2.set_linestyle('--')
line2.set_color("blue")

字体设置

import matplotlib as mpl
import matplotlib.pyplot as plt
# 获取全局外观属性配置的字典
mpl.rc_params()

1.全局设置

# 全局的
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文
mpl.rcParams['axes.unicode_minus']=False  #用来正常显示负号
# 或者plt.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams["axes.facecolor"] = "orange" # axes:画布
  • 恢复默认设置 mpl.rcdefaults()
  • 设置风格 mpl.style.use(‘seaborn-darkgrid’)
  • 获取所有风格样式 mpl.style.available

常用字体:

黑体 SimHei 仿宋 FangSong 楷体 KaiTi

# 设置汉字显示一般还要同时设定一下负号的问题
mpl.rcParams['font.sans-serif'] = "KaiTi"
mpl.rcParams['axes.unicode_minus']=False   #用来正常显示负号
plt.title("杨坤diss惊雷", color='green', fontsize=20)

2.加载自定义字体,设置局部

# ttf文件格式,提供艺术字体
from matplotlib import font_manager
# ttf加载方案 所有平台通用的艺术字格式
my_font = font_manager.FontProperties(fname = '辣鸡心心体.ttf')

my_font

plt.title("张飞的故事", fontproperties=my_font, fontsize=20, color='green')

1.3 2D图形

1.3.1 直方图

【直方图的参数只有一个x!!!不像条形图需要传入x,y】

hist()的参数

  • bins
    直方图的长条形数目,可以是一个bin数量的整数值,也可以是表示bin的一个序列。默认值为10
  • density 如果值为True,直方图的值将进行归一化处理,形成概率密度,默认值为False
参数 语法 功能
x (n,) array or sequence of (n,) arrays 数据源
bins integer or array_like 分块数,默认10
range tuple or None, optional 画图范围,接收元组
normed boolean, optional 概率分布,是否正则化
weights (n, ) array_like or None, optional 均一化相关
cumulative boolean, optional 每一列累加
bottom array_like, scalar, or None bin的基线
histtype {‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’}, optional 画图的形状,默认是bar
align {‘left’, ‘mid’, ‘right’}, optional bar中心位置,默认中间
orientation {‘horizontal’, ‘vertical’},optional 水平或垂直,默认垂直
rwidth scalar or None, optional bar的宽度
log boolean, optional 是否启用对数作为刻度
color color or array_like of colors or None, optional 表示bar的颜色
label string or None, optional bar的标签;也可以在图例中写plt.legend()
stacked boolean, optional 是否接收多个输入源
data = np.random.randn(1000)
# 每一个柱形表达的数据范围是由bins和数据的上下边界共同决定的,跟柱形的宽度没关系
plt.hist(data, bins=5, rwidth=0.6, density=True, color=np.random.random(3), label="data")
# matplotlib没有kde接口,所以要使用seaborn来绘制
#sns.kdeplot(data, color="red", label="kde")
plt.legend()
plt.hist(data, bins=5, orientation='horizontal')

1.3.2 条形图

条形图有两个参数x,y】

  • width 纵向设置条形宽度
  • height 横向设置条形高度

bar()、barh()

参数 语法 功能
x sequence of scalars 数据源
height scalar or sequence of scalars bar的高度
width scalar or array-like, optional bar的宽度,默认0.8
bottom scalar or array-like, optional y轴的基准,默认0
align {‘center’, ‘edge’}, optional, default: ‘center’ x轴的位置,默认中间,edge表示将bar的左边与x对齐
color scalar or array-like, optional bar颜色
edgecolor scalar or array-like, optional 边颜色
linewidth scalar or array-like, optional 边的宽度,0表示无边框
tick_label string or array-like, optional 标签,默认无,使用数字标签
xerr, yerr scalar or array-like of shape(N,) or shape(2,N), optional 误差线
ecolor scalar or array-like, optional, default: ‘black’ 误差线的颜色,默认黑
capsize scalar, optional 误差线的长度,默认无,自动获取
error_kw dict, optional 通过字典项传递错误bar
log bool, optional, default: False 为真表示y轴以log对象做刻度,默认假
orientation {‘vertical’, ‘horizontal’}, optional 垂直还是水平,默认垂直
data = [100,200,140,160]
names = ["lucy","mery","tom","jack"]
# 柱状图的颜色可以随机多次设置
plt.bar(x=names, height=data, width=0.7, color=np.random.random((4,3)))
money = np.random.randint(100,300,size=100)
plt.bar(x=np.arange(100), height=money, color=np.random.random((5,3)))
plt.figure(figsize=(5,20))
plt.barh(y=np.arange(100), width=money, color=np.random.random((100,3)), height=0.9)
plt.yticks(np.arange(100))
plt.show()

玫瑰图/极坐标条形图

创建极坐标,设置polar属性

  • plt.axes(polar = True)
data = np.random.randint(3,10,size=8)
plt.bar(x=np.arange(8), height=data)
plt.axes(polar=True)
# 极坐标的坐标系范围是固定的 0-2π
# 极坐标的“横轴”坐标刻度是用弧度表示的
x = np.linspace(0,2*np.pi, 8, endpoint=False)
plt.bar(x=x, height=data, color=np.random.random((8,3)), align = 'edge')

1.3.3 饼图

【饼图也只有一个参数x!】

pie()
饼图适合展示各部分占总体的比例,条形图适合比较各部分的大小

参数 语法 功能
explode [ None | len(x) sequence ] 接收小数的列表,表示每一块饼与圆心的距离,即单独移动一块饼凸现出来
colors [ None | color sequence ] 每块饼的颜色,列表
labels [ None | len(x) sequence of strings ] 饼的标签,列表
autopct [ None | format string | format function ] 每块饼的占比,百分数,%2.1f%保留一位小数
pctdistance scalar 每块饼占比与圆心的距离,默认0.6
labeldistance scalar 饼的标签与圆心的距离
shadow [ False | True ] 是否显示阴影
startangle [ None | Offset angle ] 位置偏移的起始角度,常用90
radius [ None | scalar ] 直径的大小,默认为1
counterclock [ False | True ] 逆时针或顺时针
wedgeprops [ None | dict of key value pairs ] 字典指定饼的属性
textprops [ None | dict of key value pairs ] 字典指定文本属性
center [ (0,0) | sequence of 2 scalars ] 圆心位置,接收元组
numbers = [190, 60]
plt.pie(numbers)
plt.axis('equal')
plt.show()
numbers = [190, 60, 110]
plt.pie(numbers, colors=np.random.random((3,3)),
       labels = ["李磊","王晓","子轩"],
       labeldistance = 0.8,
       autopct = "%1.1f%%",
        pctdistance = 0.3,
        explode = [0,0,0.2],
        shadow=True,
        startangle = 180
       )
plt.axis('equal')
plt.title("数据组成")
plt.show()

1.3.4 散点图

【散点图需要两个参数x,y,但此时x不是表示x轴的刻度,而是每个点的横坐标!】

scatter()

参数 语法 功能
x, y array_like, shape (n, ) 数据源
s scalar or array_like, shape (n, ), optional 标记的大小
c color, sequence, or sequence of color, optional, default: ‘b’ 标记颜色,默认黑
marker MarkerStyle, optional, default: ‘o’ 标记的风格
cmap Colormap, optional, default: None 颜色模式,默认为 rc image.cmap
norm Normalize, optional, default: None 归一化相关
vmin, vmax scalar, optional, default: None 规范最大值和最小值的显示模式
alpha scalar, optional, default: None 0透明,1不透明
linewidths scalar or array_like, optional, default: None 标记边缘线的宽度,默认无
verts sequence of (x, y), optional marker 为None时,使用这些点做标记
edgecolors color or sequence of color, optional, default: ‘face’ 标记的边缘颜色
x = np.random.randint(0,100,size=10)
y = np.random.randint(0,100,size=10)
# 散点图的点的大小 使用s设置
plt.scatter(x, y, marker='H',s=100, color=np.random.random((10,3)))
import seaborn as sns
tips = sns.load_dataset('tips')
tips.head()

tips.day.unique()

plt.scatter(x=tips.day, y=tips.tip)

1.3.5 箱线图

data = np.random.randn(100)
plt.hist(data)
# 过滤异常值
# 1. 3倍标准差
# 2. 离群点检测
plt.boxplot(data)
plt.show()
import seaborn as sns
tips = sns.load_dataset('tips')
tips

plt.scatter(x=tips.day, y=tips.tip)
# 离散值和连续值之间的对应关系可以采用箱线图表示
for day in tips.day.unique():
    part_tips = tips.query("day == '{}'".format(day))
    plt.boxplot(part_tips.tip)
    plt.title(day)
    plt.show()

1.删除离群点

plt.boxplot(tips.tip)
plt.show()
result = tips.tip.quantile([0.25, 0.5, 0.75])
Q1 = result.iloc[0]
Q3 = result.iloc[2]
IQR = Q3 - Q1

UPPER = Q3 + 1.5*IQR
BOTTOM = Q1 - 1.5*IQR
# 可以使用上边界的值来填充超过上边界的离群点,不要使用max,min
data = tips.tip.copy()
data.loc[data > UPPER] = UPPER
data.loc[data < BOTTOM] = BOTTOM

plt.boxplot(data)
plt.show()

tips.tip.values

2.填充 上边界的值填充上边的离群点 下边界的值填充下边的离群点

1.4 图形内的文字、注释、箭头

控制文字属性的方法:

pyplot函数 API方法 描述
text() mpl.axes.Axes.text() 在Axes对象的任意位置添加文字
xlabel() mpl.axes.Axes.set_xlabel() 为X轴添加标签
ylabel() mpl.axes.Axes.set_ylabel() 为Y轴添加标签
title() mpl.axes.Axes.set_title() 为Axes对象添加标题
legend() mpl.axes.Axes.legend() 为Axes对象添加图例
figtext() mpl.figure.Figure.text() 在Figure对象的任意位置添加文字
suptitle() mpl.figure.Figure.suptitle() 为Figure对象添加中心化的标题
annnotate() mpl.axes.Axes.annotate() 为Axes对象添加注释(箭头可选)

所有的方法会返回一个matplotlib.text.Text对象

x = np.linspace(0,2*np.pi, 100)

figure = plt.figure(figsize=(10,4), facecolor='lightgray')

ax1 = plt.subplot(1,2,1, facecolor='cyan')
ax1.plot(x, np.sin(x))
ax1.text(x=3.5, y=0.8, s="this is a sin(x) of score", fontdict={
    "fontsize":12,
    "color":"r"
})
# xy  箭头指向的点
# xytext 文字的摆放位置
ax1.annotate(s="min value", xy=[3*np.pi/2, -1], xytext=[2,0], arrowprops={
    "arrowstyle":"->"
})

ax2 = plt.subplot(1,2,2, facecolor='orange')
ax2.plot(x, np.cos(x))
ax2.annotate(s="max value", xy=[0,1], xytext=[3, 0.15], arrowprops={
    "width":3,
    "headlength":5,
    "headwidth":6,
    "color":"red"
})

figure.suptitle("FIGURE TITLE", color='red')

# 画板的坐标位置的描述是相对值0-1
figure.text(x=0.5, y=0.01, s="adjfk asldkfjalsdf jk\nl;akdjflakjl kjkjalsdkfj", fontdict={
    "fontsize":25
})

图形内的文字

text()

注释

annotate()

  • xy参数设置箭头指示的位置
  • xytext参数设置注释文字的位置
  • arrowprops参数以字典的形式设置箭头的样式
  • width参数设置箭头长方形部分的宽度
  • headlength参数设置箭头尖端的长度,
  • headwidth参数设置箭头尖端底部的宽度
  • shrink参数设置箭头顶点、尾部与指示点、注释文字的距离(比例值),可以理解为控制箭头的长度
如下都是arrowstyle可以选择的风格样式

``'->'``       head_length=0.4,head_width=0.2
``'-['``       widthB=1.0,lengthB=0.2,angleB=None
``'|-|'``      widthA=1.0,widthB=1.0
``'-|>'``      head_length=0.4,head_width=0.2
``'<-'``       head_length=0.4,head_width=0.2
``'<->'``      head_length=0.4,head_width=0.2
``'<|-'``      head_length=0.4,head_width=0.2
``'<|-|>'``    head_length=0.4,head_width=0.2
``'fancy'``    head_length=0.4,head_width=0.4,tail_width=0.4
``'simple'``   head_length=0.5,head_width=0.5,tail_width=0.2
``'wedge'``    tail_width=0.3,shrink_factor=0.5

漏斗图

#绘制漏斗流失图
import pyecharts.options as opts
from pyecharts.charts import Funnel
x_data = [ "点击", "加入购物车", "收藏", "支付"]
y_data = [987911, 29427, 20997, 10240]
data = [[x_data[i], y_data[i]] for i in range(len(x_data))]

c = (Funnel().add("商品",data,label_opts=opts.LabelOpts(position="inside"),).set_global_opts(title_opts=opts.TitleOpts(title="漏斗流失图")))
c.render_notebook()
相关标签: python matlab