python数据可视化之matplotlib(中)
-
matplotlib
import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np import pandas as pd # 解决坐标轴刻度负号乱码 plt.rcParams['axes.unicode_minus'] = False # 解决中文乱码问题 plt.rcParams['font.sans-serif'] = ['Simhei']
-
matplotlib基础绘图
-
1、散点图
-
1.1 plt.plot()
plt.plot()函数可以绘制简单的散点图,利用参数 marker 可以设置线图中点的样式
x = np.linspace(0, 10, 30) y = np.sin(x) plt.plot(x, y, marker="o", color='black') plt.show()
结果为:

Markers 描述 "." 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
-
1.2 plt.scatter()
plt.scatter() 比 plt.plot() 更加灵活,可以单独控制每个散点与数据匹配,也可以让每个散点具有不同的属性
- 函数功能:绘制散点图,寻找变量之间的关系
- 调用方法:plt.scatter(x, y, c="b", label="scatter figure")
- 参数说明:
- x:x轴上的数值
- y:y轴的数值
- c:散点图中的标记的颜色
- label:标记图形内容的标签文本
import matplotlib.pyplot as plt import numpy as np x = np.random.randn(100) y = np.random.randn(100) plt.scatter(x, y) plt.show()
结果为:

plt.scatter() 中加入参数s和cmap,可以画出气泡图
参数说明:
- c:数字大小决定气泡颜色的深浅
- s:根据数据值的大小决定气泡的大小
- cmap:根据数据值的大小决定颜色的深浅
import matplotlib.pyplot as plt import numpy as np x = np.random.randn(100) y = np.random.randn(100) colors = np.random.randn(100) size = np.random.randint(20, 500, 100) plt.scatter(x, y, c=colors, s=size, alpha=0.3, cmap="hsv") plt.colorbar() plt.show()
结果为:

-
2、柱状图
-
2.1 plt.bar()
- 函数功能:在 x 轴上绘制定性数据的柱状图
- 调用方法:plt.bar(x, y)
- 主要参数:
- x:标示在 x 轴上的定性数据的类别,可以通过 tick_label 参数修改展示的分类名称
- y:每种定性数据的类别的数量
- 其他参数:
- align:柱体对齐刻度方式
- color:柱体颜色
- tick_label:刻度标签值
- alpha:柱体的透明度
- hatch:柱体填充的样式
import matplotlib.pyplot as plt import numpy as np x = ["A", "B", "C", "D", "E"] #可以是元组 y = np.random.randint(45,100,5) #可以是数组 z = ["小红", "小明", "小帅", "小英", "小晓"] plt.ylabel("成绩") plt.bar(x, y, align="center", color="c", tick_label=z, hatch="///") plt.show() #hatch参数还可以填充“/”、“///”“\\”、“|”、“-”、'+', 'x', 'o', 'O', '.', '*'
结果为:

- 2.2 plt.barh()
- 函数功能:在y轴上绘制定性数据的条形图
- 调用方法:plt.barh(x, y)
- 主要参数:
- x:标示在 y 轴上的定性数据的类别,可以通过 tick_label 参数修改展示的分类名称
- y:每种定性数据的类别的数量
- 其他参数:
- align:柱体对齐刻度方式
- color:柱体颜色
- tick_label:刻度标签值
- alpha:柱体的透明度
- hatch:柱体填充的样式
import matplotlib.pyplot as plt import numpy as np x = ["A", "B", "C", "D", "E"] #可以是元组 y = np.random.randint(45,100,5) #可以是数组 z = ["小红","小明","小帅","小英","小晓"] #可以是元组 plt.xlabel("成绩") plt.barh(x, y, align="center", color="c", tick_label=z, hatch="///") plt.show()
结果为:

- 2.3 多数据并列柱状(条形)图 — 不建议用这种方式画
import matplotlib.pyplot as plt import numpy as np x = np.arange(1,12,2) #定锚,挨着的柱在此坐标基础上加 bar_width 距离,要设置宽一点 bar_width = 0.45 # 设置柱的宽度 water = np.random.randint(20,80,6) electricity = np.random.randint(60,90,6) gas = np.random.randint(20,70,6) months = ["一月","二月","三月","四月","五月","六月"] plt.ylabel("生活成本支出") plt.bar(x, water, bar_width, align="center", label="水费", alpha=0.5) #每组的第一列,就不要添加tick_label plt.bar(x+bar_width, electricity, bar_width, align="center", tick_label=months, label="电费", alpha=0.5) #想标签居中,在这里添加tick_label plt.bar(x+bar_width*2, gas, bar_width, align="center", label="燃气费", alpha=0.5) #每组的第三列,就不要添加tick_label plt.legend() plt.grid(linestyle="-.", color="r", axis="y", alpha=0.15) #设置红色、虚线的网格线 plt.show()
结果为:

import matplotlib.pyplot as plt import numpy as np x = np.arange(1,12,2) #定锚,挨着的柱在此坐标基础上加 bar_width 距离,要设置宽一点 bar_width = 0.45 # 设置柱的宽度 water = np.random.randint(20,80,6) electricity = np.random.randint(60,90,6) gas = np.random.randint(20,70,6) months = ["一月","二月","三月","四月","五月","六月"] plt.ylabel("生活成本支出") plt.barh(x, water, bar_width, align="center", label="水费", alpha=0.5) #每组的第一列,就不要添加tick_label plt.barh(x+bar_width, electricity, bar_width, align="center", tick_label=months, label="电费", alpha=0.5) #想标签居中,在这里添加tick_label plt.barh(x+bar_width*2, gas, bar_width, align="center", label="燃气费", alpha=0.5) #每组的第三列,就不要添加tick_label plt.legend() plt.grid(linestyle="-.", color="r", axis="x", alpha=0.15) #设置红色、虚线的网格线 plt.show()
结果为:

- 2.4 堆积柱状(条形)图 — 不建议用这种方式画
- 堆积图就是将若干统计图形堆叠起来的统计图形,是一种组合式图形
- 其实是多个 plt.bar() 画图函数同时作图,只不过堆积在上面的柱状图函数 plt.bar() 中有 bottom 参数来设定
import matplotlib.pyplot as plt import numpy as np x = np.arange(6) water = np.random.randint(20,80,6) electricity = np.random.randint(60,90,6) gas = np.random.randint(20,70,6) months = ["一月","二月","三月","四月","五月","六月"] plt.ylabel("生活成本支出") plt.bar(x, water, align = "center", tick_label = months, label = "水费") plt.bar(x, electricity, align = "center", tick_label = months, label = "电费", bottom = water) #记得设置参数bottom plt.bar(x, gas, align = "center", tick_label = months, label = "燃气费", bottom = water + electricity) #记得设置参数bottom plt.legend() plt.grid(linestyle="-.", color="r", axis="y", alpha=0.15) #设置红色、虚线的网格线 plt.show()
结果为:

将 plt.bar() 函数改为 plt.barh() 函数,其中的 bottom 参数改为 left 参数,有堆积条形图:
import matplotlib.pyplot as plt import numpy as np x = np.arange(6) water = np.random.randint(20,80,6) electricity = np.random.randint(60,90,6) gas = np.random.randint(20,70,6) months = ["一月","二月","三月","四月","五月","六月"] plt.ylabel("生活成本支出") plt.barh(x, water, align = "center", tick_label = months, label = "水费") plt.barh(x, electricity, align = "center", tick_label = months, label = "电费", left = water) #记得设置参数left plt.barh(x, gas, align = "center", tick_label = months, label = "燃气费", left = water + electricity) #记得设置参数left plt.legend() plt.grid(linestyle="-.", color="r", axis="x", alpha=0.15) #设置红色的、虚线的网格线 plt.show()
结果为:

-
3、直方图 plt.hist()
直方图主要是在应用在定量数据的可视化场景中,查看连续型数据的分布特征
- 函数功能:在 x 轴上绘制定量数据的分布特征
- 调用方法:plt.hist(x)
- 参数说明:
- x:在 x 轴上绘制箱体的定量数据输入值
- bins:用于确定柱体的个数或柱体边缘范围,除了最后一个柱体左右都为闭区间,其他柱体为左闭右开区间
- color:柱体颜色
- histtype:柱体类型是
- 'bar':是传统的条形直方图。 如果是多个数据给出了并排排列的条形图
- 'step':生成默认的线图填补
- 'stepfilled':生成默认的线图填充
- label:图例内容
- rwidth:柱体宽度
import matplotlib.pyplot as plt import numpy as np x = np.random.normal(loc=10000, scale=3000, size=10000) # loc均值,scale标准差,size样本数量 bins = range(0,20000,500) # 一共40条柱体,相当于自动分箱40类 plt.hist(x, bins=bins, histtype="bar", color="#377eb8", alpha=0.6) plt.xlabel("某市居民可支配收入") plt.ylabel("人数") plt.show()
结果为:

堆积直方图需要注意添加两个参数:
- x:参数 x 需要对应两个数据对象,可以用列表“装载”
- stacked:True即两个直方图堆积,False即两个直方图并排放置
- label:因为要展现两类数据,因此标签需要额外设置
import matplotlib.pyplot as plt import numpy as np city_A = np.random.normal(loc=10000,scale=3000,size=10000) # loc均值,scale标准差,size样本数量 city_B = np.random.normal(loc=7000,scale=2000,size=10000) # loc均值,scale标准差,size样本数量 x = [city_A, city_B] labels = ["A市", "B市"] bins = range(0,20000,500) # 一共40条柱体,相当于自动分箱40类 plt.hist(x, bins=bins, histtype="bar", label=labels, stacked=True, alpha=0.5) # 需要添加参数stacked和label plt.xlabel("A市和B市居民可支配收入") plt.ylabel("人数") plt.legend(loc="upper right") plt.show()
结果为:

-
4、饼图 plt.pie()
- 函数功能:绘制定性数据的不同类别的百分比
- 调用方法:plt.pie(x)
- 主要参数:
- x:定性数据的不同类别的百分比
- explode:饼片边缘偏离圆心的百分比(想制作分裂式饼图,添加上该参数即可)
- labels:标记每份饼片的文本标签内容
- autopact:饼片文本标签内容对应的数值百分比样式
- startangle:从 x 轴作为起始位置,第一个饼片逆时针旋转的角度
- shadow:是否绘制饼片的阴影
- colors:饼片的颜色
- 其他参数:
- pctdistance:每个饼图标签的中心与圆心的距离比率,默认值0.6
- labeldistance:绘制饼图标签的径向距离,默认值1.1
import matplotlib.pyplot as plt import numpy as np percent = "0.1","0.2","0.3","0.3","0.1" # 字符串格式,加和等于1 explode = 0.1,0.1,0.1,0.1,0.5 # 比如我想突出不及格的部分,最后一个数值改为0.5 autopact = "%.2f%%" startangle = 45 types = "优异","优秀","良好","一般","不合格" # colors=["r","g","b","c","y"] plt.pie(percent, explode=explode, autopct=autopact, startangle=startangle, labels=types) #,colors=colors plt.show()
结果为:
-
5、棉棒图 plt.stem()
- 函数功能:绘制离散有序的数据
- 调用方法:plt.stem(x, y)
- 参数说明:
- x:指定棉棒的 x 轴基线上的位置
- y:绘制棉棒的长度
- linefmt:棉棒的样式
- markerfmt:棉棒末端的样式
- basefmt:指定基线的样式
import matplotlib.pyplot as plt import numpy as np x = np.linspace(0.5,2*np.pi,20) y = np.random.randn(20) #生成20个数,这些数服从标准正态分布 ,区别np.random.rand——随机样本位于[0, 1)中 plt.stem(x, y, linefmt="-.", markerfmt="o", basefmt="-") plt.show()
结果为:

-
6、箱线图 plt.boxplot()
箱线图是由一个箱体和一对箱须所组成的统计图形,箱体是由第一四分位数、中位数(第二四分位数)和第三四分位数所组成,箱须的末端之外为离群值
- 函数功能:绘制箱线图
- 调用方法:plt.boxplot(x)
- 参数说明
- x:绘制箱线图的输入数据
- whis:四分位间距的倍数,用来确定箱须,包括数据的范围大小
- widths:设置箱体的宽度
- sym:离群值的标记样式
- labels:绘制每一个数据集的刻度标签
- patch_artist:是否给箱体添加颜色
- notch:如果notch为True,则箱体有凹痕
import matplotlib.pyplot as plt import numpy as np x = np.random.randn(1000) plt.boxplot(x, whis=1.63, widths=0.35, sym="o", labels=["箱体图A"], notch=True) plt.grid(axis="y",ls=":",lw=1,color="gray",alpha=0.4) plt.show()
结果为:

相比单个箱线图,如果想制作多个箱线图,需要注意以下要点:
- 数据集参数 x 替换成包含多个数据集的对象
- 标签参数 labels 的列表要包含多个标签字符串
import matplotlib.pyplot as plt import numpy as np x = np.random.randn(1000) y = np.random.randn(1000) test_list = [x,y] plt.boxplot(test_list, whis=1.63, widths=0.35, sym="o", labels=["箱体图A","箱体图B"]) plt.grid(axis="y",ls=":",lw=1,color="gray",alpha=0.4) plt.show()
结果为:

-
7、衍生统计图形
- 7.1 间断条形图 plt.broken_barh()
间断条形图是在条形图的基础上绘制而成,主要用来可视化定性数据的相同指标在时间维度上的指标值的变化情况,实现定性数据的相同指标的变化情况的有效直观比较
import matplotlib.pyplot as plt import numpy as np plt.broken_barh([(1,2),(6,3),(12,5),(22,3),(28,2)],(10,5), facecolors="#FFCCCC") #[(1,2)...]表示该组从x轴的1开始,右移动2个单位 plt.broken_barh([(2,4),(9,3),(15,3),(20,3),(25,3)],(20,5)) #第二个参数(20,5)表示条形图宽度从y轴20开始,上移动5个单位 plt.xlim(0,32) plt.ylim(5,30) plt.xlabel("当月会议厅使用安排") plt.xticks(np.arange(0,31,1)) plt.yticks([12.5,22.5],["会议厅1","会议厅2"]) plt.show()
结果为:

-
7.2 阶梯图 plt.step()
阶梯图用来放映数据的趋势变化或是周期规律,经常用来使用在时间序列数据的可视化任务中,凸显时序数据的波动周期和规律
import matplotlib.pyplot as plt import numpy as np x = np.arange(1,15) y = np.cos(x) plt.step(x, y, color="#3399CC", where="post", lw=2) #where="pre"为数据点偏左侧绘制x垂直线到下一个数据点,"post"为偏右侧 plt.xlim(0,15) plt.xticks(np.arange(1,15,1)) plt.ylim(-1.2,1.2) plt.show()
结果为:

-
8、三维函数的可视化
- np.meshgrid(x,y):从坐标向量返回坐标矩阵,可以用两个一维数组构建二维网格数据
- plt.contour(X,Y,Z):根据三个坐标轴构建等高图
def f(x, y): return np.sin(x)**10+np.cos(10+y*x)*np.cos(x) x = np.linspace(0,5,50) y = np.linspace(0,5,40) X, Y = np.meshgrid(x, y) Z = f(X, Y) plt.contour(X, Y, Z, colors='black') plt.show()
结果为:

- 需要注意的是,如果只使用一种颜色,会默认使用虚线表示负数,实线表示正数
- 如果想绘制彩色的等高图,需要用 cmap 参数来设置线条的配色方案
def f(x, y): return np.sin(x)**10+np.cos(10+y*x)*np.cos(x) x = np.linspace(0,5,50) y = np.linspace(0,5,40) X, Y = np.meshgrid(x, y) Z = f(X, Y) plt.contour(X, Y, Z, 20, cmap='terrain') # 将数据范围等分为20份,用不同的颜色表示 plt.show()
结果为:

想进一步填充,可以使用 plt.contourf() ,其语法和 plt.contour() 一样
def f(x, y): return np.sin(x)**10+np.cos(10+y*x)*np.cos(x) x = np.linspace(0,5,50) y = np.linspace(0,5,40) X, Y = np.meshgrid(x, y) Z = f(X, Y) plt.contourf(X, Y, Z, 20, cmap='terrain') # 将数据范围等分为20份,用不同的颜色表示 plt.show()
结果为:


浙公网安备 33010602011771号