14.1 认识Matplotlib
-
Matplotlib 是 Python 中的数据可视化软件包之一,支持跨平台运行,它是Python常用的 2D 绘图库,同时它也提供了一部分3D绘图接口,Matplotlib通常与NumPy、Pandas一起使用,是数据分析中不可或缺的重要工具之一
-
通过 Matplotlib,我们可以仅需要几行代码,便可以生成图表、直方图、柱状图、饼状图、散点图等
-
Matplotlib安装:pip install matplotlib
首先导入matplotlib包中的pyplot模块,并以as别名的形式简化引入包的名称
from matplotlib import pyplot as plt
因为要经常用到numpy里面的方法,所以我们也需要导入numpy包
import numpy as np
14.2 基本图形绘制
14.2.1 入门案例
在绘图时,需要一个Figure对象,可以理解成需要一张画布才能开始绘图。
画布设置:
plt.figure(num, figsize, dpi, facecolor)
- num:图像编号或名称,数字为编号 ,字符串为名称
- figsize:指定figure的宽和高,单位英寸
- dpi:图形分辨率,每英寸多少像素
- facecolor:背景颜色
示例:绘制抛物线
#首先导入matplotlib包中的pyplot模块,并以as别名的形式简化引入包的名称
from matplotlib import pyplot as plt
#引入numpy包
import numpy as np
#画布设置,默认画布大小大概是6.4*4.8
fig = plt.figure(num= '抛物线',figsize=(6,4), dpi=100, facecolor='grey')
#绘制抛物线
x = np.arange(-20,21)
y = x ** 2
#plot()绘制线性图表
plt.plot(x,y)
plt.show()
结果如下:
14.2.2 plot参数解析
plot是Matplotlib中用于绘制线形图的函数,它有多个参数可以控制绘图的各个方面。以下是常用的一些参数及其作用
plot(x, y, color, linestyle, marker, markersize, markerfacecolor, alpha)
- x,y:必须参数,x,y轴数据的列表或数组
- color:线条的颜色
- linestyle:线条的样式
- marker :绘图点的标记样式
- markersize:设置标记的大小
- markerfacecolor:设置标记的颜色
- alpha:设置线条的透明度
linestyle部分线条样式取值
marker 样式取值
示例:
from matplotlib import pyplot as plt
import numpy as np
#plot()属性设置
x = np.arange(-20,21)
y = x ** 2
plt.plot(x, y, color = 'red', linestyle = '--', marker = 'D',markersize = 5, markerfacecolor = 'green',alpha = 0.9)
plt.show()
结果如下:
color(颜色属性)
- 全称:red,blue,yellow,green
- 缩写:b(蓝色),g(绿色),r(红色),c(青色),m(品红),y(黄色),k(黑色),w(白色)
- 十六进制:黑色:#000000,白色:#ffffff,红色:#ff0000,绿色:#00ff00,蓝色:#0000ff,黄色:#ffff00
1、使用全称
from matplotlib import pyplot as plt
import numpy as np
#全称
x = np.arange(-20,21)
y = x ** 2
plt.plot(x, y, color = 'red')
plt.show()
结果如下:
2、使用缩写
from matplotlib import pyplot as plt
import numpy as np
#缩写
x = np.arange(-20,21)
y = x ** 2
plt.plot(x, y, color = 'g')
plt.show()
结果如下:
3、使用十六进制
from matplotlib import pyplot as plt
import numpy as np
#十六进制
x = np.arange(-20,21)
y = x ** 2
plt.plot(x, y, color = '#0000ff')
plt.show()
结果如下:
14.2.3 基本方法
1、标题
plt.title(label, loc, fontsize, color)
- label:标题
- loc:位置
- fontsize:文字大小
- color:颜色
标题不支持中文
要显示中文,字体为中文黑体
plt.rcParams[‘font.sans-serif’] = ‘SimHei’
其他字体(‘Kaiti’:中文楷体,‘Lisu’:中文隶书,‘STSong’:华文宋体等)
当字体设置支持中文后,必须设置负号,否则当数值中出现负号时无法显示
让图片中可以显示负号
plt.rcParams[‘axes.unicode_minus’] = False
示例:
from matplotlib import pyplot as plt
import numpy as np
#标题title()
x = np.arange(-20,21)
y = x ** 2
plt.title('y = x^2', loc='center', fontsize = 20, color = 'red')
plt.plot(x,y)
plt.show()
结果如下:
示例:
from matplotlib import pyplot as plt
import numpy as np
x = np.arange(-20,21)
y = x ** 2
plt.title('y等于x的平方', loc='center', fontsize = 20, color = 'red')
plt.rcParams["font.sans-serif"] = 'SimHei'
plt.rcParams["axes.unicode_minus"] = False
plt.plot(x,y)
plt.show()
结果如下:
2、坐标轴
坐标轴名称
plt.xlabel(label, fontsize, rotation)
plt.ylabel(label, fontsize, rotation)
- label:标题
- fontsize:文字大小
- rotation:旋转角度
示例:
from matplotlib import pyplot as plt
import numpy as np
#坐标轴名称
x = np.arange(-20,21)
y = x ** 2
plt.plot(x,y)
#x轴默认旋转角度是0度
plt.xlabel('x轴', fontsize = 15)
#y轴默认旋转角度是90度
plt.ylabel('y轴', fontsize = 15)
plt.title('y等于x的平方', fontsize = 15)
plt.show()
结果如下:
坐坐标轴范围
plt.xlim(left, right)
plt.ylim(left, right)
示例:
from matplotlib import pyplot as plt
import numpy as np
#坐标轴范围
x = np.arange(-20,21)
y = x ** 2
plt.plot(x,y)
#设置x轴范围
plt.xlim(-10,10)
#设置y轴范围
plt.ylim(0,100)
plt.show()
结果如下:
坐标轴刻度
plt.xticks(ticks, labels, rotation, fontsize, color)
- ticks:指定刻度的位置
- labels:指定刻度标签的文本
- rotation:指定刻度标签的旋转角度
- fontsize:指定刻度标签的字体大小
- color:指定刻度标签的字体颜色
示例:
from matplotlib import pyplot as plt
import numpy as np
#坐标轴刻度
x = np.linspace(0, 10)
y = np.sin(x)
plt.plot(x,y)
# 设置x轴y轴刻度
plt.xticks(np.arange(0, 11))
plt.yticks(
ticks=[-1,0,1], # 刻度位置
labels=[-1,0,1], # 刻度标签
rotation=45, # 标签旋转角度
fontsize=12, # 标签字体大小
color='blue' # 标签颜色
)
plt.show()
结果如下:
坐标轴的操作:plt.gca() 和ax.spines()
- plt.gca() 是 Matplotlib 库中的一个函数,用于获取当前的 Axes 对象。Axes对象表示一个绘图区域,包含了坐标轴、刻度线、标签等元素。通过获取 Axes 对象,可以对其进行进一步的配置和修改。
- ax.spines() 是一个用于获取或设置 Axes对象的四条边框线的函数。这四条边框线分别是上、下、左、右四条边,它们定义了坐标轴的范围。通过set_color()方法来设置颜色,通过set_position() 方法来改变边框的位置。
示例:
from matplotlib import pyplot as plt
import numpy as np
#对坐标轴的操作gca(),gca get current axes获取当前的轴
x = np.arange(-20,21)
y = x ** 2
#获取当前坐标轴
ax = plt.gca()
#通过坐标轴spines,确定top,bottom,left,right
#不需要右侧和上侧线条,则可以设置它的颜色为none
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
#移动左轴到指定距离,axes:0.0-1.0之间的值,整个轴上的比例
ax.spines['left'].set_position(('axes',0.5))
#移动下轴到指定位置,data表示按数值挪动,其后数字代表挪动到y轴的刻度值
ax.spines['bottom'].set_position(('data',0.0))
plt.plot(x,y)
plt.show()
结果如下:
14.2.4 图例legend()
当我们绘制多个图形时,通过在图例中标注每个图形的含义,可以让读者更容易理解图表。
legend(list, loc, fontsize, ncol)
- loc:控制图例位置,常见’left’,’upper
- right’,’lower left’,’center left’等
- fontsize:图例的字体大小
- ncol:图例展示为几列,默认展示为1列
示例:
from matplotlib import pyplot as plt
import numpy as np
#图例legend()
x = np.linspace(0, 2*np.pi)
plt.plot(x, np.sin(x)) # 正弦曲线
plt.plot(x, np.cos(x)) # 余弦曲线
#图例,位置左下,显示两列
plt.legend(['Sin','Cos'], fontsize=12, loc='lower left')
plt.show()
结果如下:
14.2.5 网格grid()
grid(b, axis, linestyle, color, linewidth)
- b:布尔值,控制是否显示网格线。默认是True。
- axis:指定要绘制网格线的轴。可以是’both’(默认值)、‘x’ 或 ‘y’。
- color:设置网格线的颜色。
- linestyle(ls):设置网格线的线型,如 ‘-’、‘:’、‘–’ 等。
- linewidth (lw):设置网格线的线宽。
示例:
from matplotlib import pyplot as plt
import numpy as np
#网格grid()
x = np.linspace(0, 10)
y = np.sin(x)
plt.plot(x,y)
#网格线设置,网格线样式为虚线,线宽0.5,颜色灰色,显示y轴
plt.grid(ls='--', lw=0.5, c='grey', axis='both')
plt.show()
结果如下:
14.2.6 文本text()
使用text函数可以在图表中添加文字标注,从而更好地解释和说明数据。
text(x, y, s, fontsize, color)
- x:为文本显示的横坐标。
- y:为文本显示的纵坐标。
- s:为显示内容。
示例:
from matplotlib import pyplot as plt
import numpy as np
#文本text()
x = np.linspace(0, 10, 10)
y = np.array([60, 30, 20, 90, 40, 60, 50, 80, 70, 30])
plt.plot(x, y, ls='--', marker='o')
#文本
for a, b in zip(x, y):
#文本设置
plt.text(x=a + 0.2, y=b + 0.3, s=b, fontsize=14, color='r')
plt.show()
结果如下:
14.3 多图布局
我们有时候需要在一张画布中分别绘制多个图形,方便我们进行观察,效果如下
14.3.1 均匀分布subplot()函数
subplot(a, b, c)
- a:是subplot的行数
- b:是subplot的列数
- c:是subplot中子图的序号
注意:区域对象的方法很多都是set_开头
示例:
from matplotlib import pyplot as plt
import numpy as np
#subplot()函数
x = np.linspace(-np.pi, np.pi)
y = np.sin(x)
z = np.cos(x)
# 子图1,2行1列的第1个子视图
axes1 = plt.subplot(2,1,1)
axes1.plot(x, y)
axes1.set_title('子图1')
# 子图2,2行1列的第2个子视图
axes2 = plt.subplot(2,1,2)
axes2.plot(x, z)
axes2.set_title('子图2')
#使用light_layout()消除子图标题重叠
plt.tight_layout()
plt.show()
结果如下:
14.3.2 不均匀分布
示例:
from matplotlib import pyplot as plt
import numpy as np
#不均匀分布
x = np.linspace(-np.pi, np.pi)
y = np.sin(x)
# 子图1,2行2列的第1个子图区域
axes1 = plt.subplot(2, 2, 1)
axes1.plot(x, y, color='red')
axes1.set_title('子图1')
# 子图2,2行2列的第2个子图区域
axes2 = plt.subplot(2, 2, 2)
axes2.plot(x, y, marker = '*')
axes2.set_title('子图2')
# 子图3,2行1列的第2个子图区域
axes3 = plt.subplot(2, 1, 2)
axes3.plot(x, np.sin(x*x))
axes3.set_title('子图3')
plt.tight_layout()
plt.show()
结果如下:
14.3.3 图形嵌套
add_subplot函数
示例:
from matplotlib import pyplot as plt
import numpy as np
#图形嵌套
fig = plt.figure()
# 使用add_subplot()函数,必须先创建一个figure对象
# 图1
axes1 = fig.add_subplot(111)
#如果只提供一个列表或数组,则默认为y轴的值,x轴的值为该列表或数组的索引。
axes1.plot([1, 3])
# 图2
axes2 = fig.add_subplot(221)
axes2.plot([1, 3])
# 图3
axes3 = fig.add_subplot(224)
axes3.plot([1, 3])
plt.show()
结果如下:
图1占用整个画布绘制
图2,3将画布分为2行2列,将位置1,4用来绘制图形
14.3.4 subplots()函数
subplots()函数与subplot()函数相似,不同之处是,subplots()既创建了一个包含子图区域的画布,又创建了一个figure对象,而subplot()只是创建了一个包含子图的画布。
返回的axes对象是一个包含所有子图的一个数组
示例:
from matplotlib import pyplot as plt
import numpy as np
#subplots()函数
fig,axes =plt.subplots(2,2)
x = np.arange(1,5)
#第一个区域ax1
ax1 = axes[0][0]
#绘制平方函数
ax1.plot(x, x*x)
ax1.set_title('square')
#绘制平方根图像
axes[0][1].plot(x, np.sqrt(x))
axes[0][1].set_title('square root')
#绘制指数函数
axes[1][0].plot(x, np.exp(x))
axes[1][0].set_title('exp')
#绘制对数函数
axes[1][1].plot(x, np.log10(x))
axes[1][1].set_title('log')
plt.tight_layout()
plt.show()
结果如下:
14.4 常用图形
14.4.1 柱状图 bar()
bar(x, height, width, bottom, color, alpha)
- height:表示柱状图的高度,也就是y坐标值,数据类型为float类型,一般为一个列表,包含生成柱状图的所有y值
- width:表示柱状图的宽度,取值在0~1之间,默认值为0.8
- bottom:柱状图的起始位置,也就是y轴的起始坐标,默认值为None
- color:柱状图颜色,默认为蓝色
- alpha:透明度,取值在0~1之间,默认值为1
示例:
from matplotlib import pyplot as plt
import numpy as np
#柱状图 plt.bar()
x = ['语文', '数学', '英语', 'Python', '化学']
y = [20, 10, 40, 60, 10]
plt.bar(x, y, alpha = 0.5, color = 'green')
plt.show()
结果如下:
1、堆叠柱状图
示例:
from matplotlib import pyplot as plt
import numpy as np
#堆叠柱状图
#国家
countries = ['挪威','德国','中国','美国','瑞典']
#金牌个数
#使用numpy里的array函数将列表转换成数组
gold_medal = np.array([16,12,9,8,8])
#银牌个数
silver_medal = np.array([8,10,4,10,5])
#铜牌个数
bronze_medal = np.array([13,5,2,7,5])
#绘制图形
plt.bar(countries,gold_medal,bottom=bronze_medal+silver_medal,color = 'gold',width=0.2)
plt.bar(countries,silver_medal,bottom=bronze_medal,color = 'silver',width=0.2)
plt.bar(countries,bronze_medal,color = 'saddlebrown',width=0.2)
plt.show()
结果如下:
2、多位置柱状图
同一x轴位置绘制多个柱状图,主要通过调整柱状图的宽度和每个柱状图x轴的起始位置
示例:
from matplotlib import pyplot as plt
import numpy as np
#多位置柱状图
countries = ['挪威','德国','中国','美国','瑞典']
gold_medal = [16,12,9,8,8]
silver_medal =[8,10,4,10,5]
bronze_medal =[13,5,2,7,5]
#将x轴转换为数值
x = np.arange(len(countries))
#设置图形宽度
width = 0.2
#金牌起始位置
gold_x = x
#银牌起始位置
silver_x = x+width
#铜牌起始位置
bronze_x = x+ width * 2
#绘制图形
plt.bar(gold_x,gold_medal,width=width,color = 'gold',label = '金牌')
plt.bar(silver_x,silver_medal,width=width,color = 'silver',label = '银牌')
plt.bar(bronze_x,bronze_medal,width=width,color = 'saddlebrown',label = '铜牌')
plt.legend(loc = 'upper right')
# #x标签的位置居中
plt.xticks(x+width,labels=countries)
plt.show()
结果如下:
14.4.2 直方图hist()
hist(x, bins, color, edgecolor, orientation, stacked)
- bins:指定直方图的箱体数量或箱体的边界值。默认值为10
- color :箱体颜色
- edgecolor: 直方图边缘的颜色
- orientation:直方图的方向,可以是’vertical’(垂直,默认)或 ‘horizontal’。
- stacked:默认为False,是否为堆积状图
示例:
from matplotlib import pyplot as plt
import numpy as np
#直方图plt.hist()
#使用numpy随机生成100个随机数据
x = np.random.randint(0, 11, 100)
#绘制图形,bins=5则代表绘制5个箱体,
plt.hist(x, bins=5)
plt.show()
结果如下:
示例:
from matplotlib import pyplot as plt
import numpy as np
x = np.random.randint(0, 11, 100)
#然后指定各个区间的范围,[0,2),[2,4),[4,6),[6,8),[8,10)
plt.hist(x, bins=[0, 2, 4, 6, 8, 10],edgecolor='white')
plt.show()
结果如下:
堆叠直方图,多类型直方图
示例:
from matplotlib import pyplot as plt
import numpy as np
#堆叠直方图,多类型直方图
#准备三组组数据:
x_value = np.random.randint(140,180,100)
x2_value = np.random.randint(140,180,100)
x3_value = np.random.randint(140,180,100)
#以列表的形式传入三组数据,设置直方图的stacked为True,允许数据覆盖,默认为False
plt.hist([x_value,x2_value,x3_value],bins = 10, stacked= False,edgecolor = 'white')
plt.show()
结果如下:
14.4.3 饼状图 pie()
pie(x, autopct, explode, shadow, labeldistance, pctdistance)
- x:浮点型数组或列表,用于绘制饼图的数据,表示每个扇形的面积
- autopct:用于在饼图中显示每个扇形的百分比值:%.2f,小数点后保留两位,%.2f%%,显示百分比符号
- explode :指定哪些扇形要凸出显示
- shadow :布尔值,是否在饼图下面添加阴影
- labeldistance:表示的各扇形区域标签与圆心的距离
- pctdistance:表示百分比与圆心的距离
示例:
from matplotlib import pyplot as plt
import numpy as np
#饼状图plt.pie()
#定义饼每个区域的标签
labels = ['娱乐','育儿','饮食','房贷','交通','其他']
#每个标签所占的数量
x = [200,500,1200,7000,200,900]
#绘制饼状图,x是一个列表,列表元素对应扇形区域的数量大小,labels为每个区域设置一个标签
plt.pie(x,labels= labels,autopct='%.2f%%')
plt.show()
结果如下:
示例:
from matplotlib import pyplot as plt
import numpy as np
#饼状图plt.pie()
labels = ['娱乐','育儿','饮食','房贷','交通','其他']
x = [200,500,1200,7000,200,900]
# #饼状图的分离 explode:指定饼图某些部分的突出显示,距离圆心的距离
explode = [0.03,0.05,0.06,0.04,0.08,0.1]
#设置阴影图,labeldistance表示的各扇形区域标签与圆心的距离,pctdistance表示百分比与圆心的距离
plt.pie(x,labels= labels,autopct='%.2f%%',explode = explode,
shadow= True,labeldistance= 1.35,pctdistance= 1.2)
plt.show()
结果如下:
14.4.4 散点图 scatter()
scatter(x, y, s , c , cmap)
- x,y:散点坐标
- s:散点面积大小
- c:散点颜色
- cmap:颜色条,默认None,标量或者是一个colormap的名字,只有c是一个浮点数数组的时才使用
示例:
from matplotlib import pyplot as plt
import numpy as np
#散点图plt.scatter()
#x轴数据
x = [1,2,3,4,5,6,7,8]
#y轴数据
y = [1,4,9,16,7,11,23,18]
#绘制散点图
plt.scatter(x,y,s = 10)
plt.show()
结果如下:
14.4.5 自定义颜色
示例:
from matplotlib import pyplot as plt
import numpy as np
#自定义点的颜色
#x轴数据
x = np.random.rand(10)
print(x)
#y轴数据
y = np.random.rand(10)
print(y)
#生成一个浮点数或N维浮点数组
s = (30 * np.random.rand(10)) ** 2
print(s)
#颜色随机
colors = np.random.rand(10)
print(colors)
plt.scatter(x,y,s,c = colors,cmap= 'magma')
#colorbar() 函数设置了色卡
cbar = plt.colorbar()
plt.show()
#运行结果
[0.68830197 0.72804179 0.05401797 0.6432706 0.60768534 0.8827824
0.87120781 0.52231624 0.73000955 0.63951085]
[0.47941975 0.97585361 0.53586238 0.29329211 0.16935829 0.56105792
0.1549289 0.63040406 0.07032587 0.3225049 ]
[ 9.41892394 388.20080094 142.99355291 768.99770947 524.46896218
62.02178115 103.58772876 129.95547109 285.40665899 383.17334544]
[0.21522527 0.81219198 0.56988226 0.08500541 0.42731529 0.63041104
0.18757102 0.03408038 0.51884646 0.92454706]
结果如下: