Matplotlib绘图_03
- 1.直方图
- 2.扇形图
- 3.箱型图
- 4.雷达图
- 5.Axes容器
- 5.1 Axes介绍
- 5.2 设置x和y轴的最大值与最小值
- 5.3 添加文本
- 5.4 绘制双y轴
- 6.1 Axis介绍
- 6.2 设置x轴和y轴label的位置
- 6.3 显示子刻度
- 6.4 多图布局
- 6.5 自定义布局
1.直方图
直方图介绍:直方图由一系列高度不等的纵向条纹或线段表示数据分布的情况,一般用横轴表示数据范围,纵轴表示分布情况。
直方图特点:绘制连续性的数据,展示一组或者多组数据的分布情况(统计)。
- plt.hist(x, bins=None):绘制以x为数值,bins为组数的直方图
组数 = 极差/组距
举个例子:某地区连续50年中四月份平均气温数据如下:
temp_li=[6.9,4.1,6.6,5.2,6.4,7.9,8.6,3.0,4.4,6.7,7.1,4.7,9.1,6.8,8.6,5.2,5.8,7.9,5.6,8.8,8.1,5.7,8.4,4.1,6.4,6.2,5.2,6.8,5.6,5.6,6.8,8.2,6.4,4.8,6.9,7.1,9.7,6.4,7.3,6.8,7.1,4.8,5.8,6.5,5.9,7.3,5.5,7.4,6.2,7.7]
根据以上数据,推断该地区四月份平均气温的分布类型。
from matplotlib import pyplot as pltimport matplotlibfont = {\'family\':\'SimHei\',\'weight\':\'bold\',\'size\':12}matplotlib.rc(\"font\", **font)# plt.figure(figsize=(10,5))temp_li=[6.9,4.1,6.6,5.2,6.4,7.9,8.6,3.0,4.4,6.7,7.1,4.7,9.1,6.8,8.6,5.2,5.8,7.9,5.6,8.8,8.1,5.7,8.4,4.1,6.4,6.2,5.2,6.8,5.6,5.6,6.8,8.2,6.4,4.8,6.9,7.1,9.7,6.4,7.3,6.8,7.1,4.8,5.8,6.5,5.9,7.3,5.5,7.4,6.2,7.7]# min(temp_li) # 3.0# max(temp_li) # 9.7cha = max(temp_li)-min(temp_li)b = 1# bi = round(cha)/b # 去查一下python当中的四舍五入# bi # 7.0 TypeError: `bins` must be an integer, a string, or an array# 方法一:int()# 方法二:整除//bi = round(cha)//b # 去查一下python当中的四舍五入# 求组数 组数=极差/组距plt.hist(temp_li,bins=bi,density=True) # 注意:bins一定是整数类型,默认为10 density表示频率# 显示标签plt.xlabel(\"区间\")plt.ylabel(\"频数/频率\")plt.title(\"直方图\")plt.show()
2.扇形图
扇形图介绍:扇形图,用整个圆表示总数,用圆内各个扇形的大小表示各部分数量占总数的百分数。
- plt.pie(x,explode=None,labels=None ):绘制扇形图
(1)x 扇形数据
(2)explode 设置某几个分块是否要分离饼图
(3)labels 每块扇形标签
(4)autopct 百分比数据标签
(5)shadow 是否显示阴影
注意:plt.pie()有三个返回值
(1)patches 绘制饼图每一块的对象
(2)texts 文本的列表
(3)autotexts 百分比的文本列表
举个例子:将以下frac数据绘制扇形图,并且设置其扇形标签为label
frac = [1/50,6/50,11/50,15/50,9/50,6/50,2/50]
label = [’[3,4]’,’(4,5]’,’(5,6]’,’(6,7]’,’(7,8]’,’(8,9]’,’(9,10]’]
from matplotlib import pyplot as pltimport matplotlibfont = {\'family\':\'SimHei\',\'weight\':\'bold\',\'size\':12}matplotlib.rc(\"font\", **font)frac = [1/50,6/50,11/50,15/50,9/50,6/50,2/50]label = [\'[3,4]\',\'(4,5]\',\'(5,6]\',\'(6,7]\',\'(7,8]\',\'(8,9]\',\'(9,10]\']explodes = (0,0,0.1,0,0,0,0)patches,texts,autotexts = plt.pie(frac,labels=label,autopct=\"%.2f%%\",explode=explodes,shadow=True,textprops={\"size\":15})# print(patches)# print(texts)# print(autotexts)# 设置百分比数值 为白色for autotext in autotexts:autotext.set_color(\"w\")plt.show()
3.箱型图
箱型图介绍:箱线图是一种直观简洁的方式去呈现一组数据的分布。 箱线图广泛用于各个数据分析领域,它能非常简单明了地显示一组数据中5个重要数值,并且还能发现一组数据中的存在的异常值。
- 最大值
- 最小值
- 中位数
- 下四分位数(Q1)
- 上四分位数(Q3)
- plt.boxplot():绘制箱型图
(1)x:需要绘制的箱型图的数据
(2)notch:是否展示置信区间 默认为False
(3)sym:代表异常点的符号表示 默认为圆点
(4)vert:是否是垂直的 默认是True
(5)whis:上下限系数 默认为1.5
(6)positions:设置每个盒子的位置
(7)widths:设置每个盒子的宽度
(8)labels:每个盒子的label
(9)meanline和showmean:都为True的时候 会展示平均线
举个例子:
import matplotlib.pyplot as pltimport randomplt.rcParams[\'font.sans-serif\'] = [\'SimHei\'] # 步骤一(替换sans-serif字体)plt.rcParams[\'axes.unicode_minus\'] = False # 步骤二(解决坐标轴负数的负号显示问题)\"\"\"随机生成100个1-100的数据\"\"\"data = [random.randint(1,100) for i in range(100)]# 添加异常值 -100,500 建议看说明文档data.extend([-100,500])# 均值>中位数 -->数值偏大plt.boxplot(data,sym=\"^\",widths=0.2,meanline=True,showmeans=True)plt.show()
4.雷达图
雷达图介绍:雷达图(Radar Chart)又被叫做蜘蛛网图,适用于显示三个或更多的维度的变量的强弱情况。比如某个企业在哪些业务方面的投入等,都可以用雷达图方便的表示。
- plt.polar():绘制雷达图
(1)这个方法的参数跟plt.plot非常的类似,只不过是x轴的坐标点应该为弧度(2PI=360°)。*
注意:
(2)因为polar并不会完成线条的闭合绘制,所以我们在绘制的时候需要在theta中和values中在最后多重复添加第0个位置的值,然后在绘制的时候就可以和第1个点进行闭合了。
(3)polar只是绘制线条,所以如果想要把里面进行颜色填充,那么需要调用fill函数来实现。
(4)polar默认的圆圈的坐标是角度,如果我们想要改成文字显示,那么可以通过xticks来设置。
举个例子:
import matplotlib.pyplot as pltimport numpy as npplt.rcParams[\'font.sans-serif\'] = [\'SimHei\'] # 步骤一(替换sans-serif字体)plt.rcParams[\'axes.unicode_minus\'] = False # 步骤二(解决坐标轴负数的负号显示问题)quaters = [\'Q1\',\'Q2\',\'Q3\',\'Q4\',\'Q1\'] # 不是x,x是弧度sales = [40,91,44,90,40]# 求theta 2*PI=360theta = np.linspace(0,np.pi*2,5) # 创建等差数列 1,2,3,4# 绘制图形plt.polar(theta,sales)# 设置刻度plt.xticks(theta,quaters)plt.fill(theta,sales)plt.show()
参考链接
5.Axes容器
5.1 Axes介绍
Axes容器是用来创建具体的图形的。比如画曲线,柱状图,都是画在上面。所以之前我们学的使用plt.xx绘制各种图形(比如条形图,直方图,散点图等)都是对Axes的封装。
5.2 设置x和y轴的最大值与最小值
set_xlim:设置x轴最大值和最小值
set_ylim:设置y轴最大值和最小值
例:
import matplotlib.pyplot as pltimport randomimport numpy as npplt.rcParams[\'font.sans-serif\'] = [\'SimHei\'] # 步骤一(替换sans-serif字体)plt.rcParams[\'axes.unicode_minus\'] = False # 步骤二(解决坐标轴负数的负号显示问题)fig=plt.figure()axl=plt.subplot(111)axl.plot(range(10),range(10))# 给x,y轴设置上下限 为-2到12axl.set_xlim(-2,12)axl.set_ylim(-2,12)plt.show()
5.3 添加文本
text():之前添加文本我们用的是annotate,但是如果不是需要做注释,其实还有另外一种更加简单的方式,那就是使用text方法。
例:
import matplotlib.pyplot as pltimport randomimport numpy as npplt.rcParams[\'font.sans-serif\'] = [\'SimHei\'] # 步骤一(替换sans-serif字体)plt.rcParams[\'axes.unicode_minus\'] = False # 步骤二(解决坐标轴负数的负号显示问题)fig = plt.figure()ax1 = plt.subplot(111)ax1.plot(range(10),range(10),marker=\"o\")# 想在(0,0)的位置显示文本ax1.text(0-0.3,0+0.5,\"(0,0)\")plt.show()
5.4 绘制双y轴
步骤:
绘制图1为: ax1
通过 ax2 = ax1.twinx() 克隆 ax1
绘制图2位: ax2
例:
fig = plt.figure()# 绘制ax1ax1 = plt.subplot(111)ax1.bar(range(10),[random.randint(-10,40) for i in range(10)])ax1.set_ylabel(\"温度\")# 克隆ax1 共享x轴ax2 = ax1.twinx()ax2.plot(range(10),[random.randint(0,200) for i in range(10)],marker=\"o\",color=\"r\")ax2.set_ylabel(\"降水量\")plt.show()
6.Axis容器
6.1 Axis介绍
Axis代表的是x轴或者y轴的对象。包含Tick(刻度)对象,TickLabel刻度文本对象,以及AxisLabel坐标轴文本对象。axis对象有一些方法可以操作刻度和文本等。
参考链接
6.2 设置x轴和y轴label的位置
ax1.yaxis.set_label_coords(x,y):设置y轴label位置
fig = plt.figure()# 绘制ax1ax1 = plt.subplot(111)ax1.bar(range(10),[random.randint(-10,40) for i in range(10)])ax1.set_ylabel(\"温度\")# 设置y轴label的位置为上方ax1.yaxis.set_label_coords(-0.1,1)
6.3 显示子刻度
ax1.minorticks_on():显示子刻度
注意:自定义刻度格式时,若想显示1.32%类型,则应写\”%.2f%%\”。
例:
from matplotlib import tickerfig = plt.figure()# 绘制ax1ax1 = plt.subplot(111)ax1.bar(range(10),[random.randint(-10,40) for i in range(10)])ax1.set_ylabel(\"温度\")# 自定义刻度格式formatter = ticker.FormatStrFormatter(\"%.2f%%\")# 设置刻度格式ax1.yaxis.set_major_formatter(formatter)# 设置子刻度ax1.minorticks_on()plt.show()
6.4 多图布局
- 调整子图间距:
(1)使 fig.subplots_adjust(left=None,bottom=None,right=None,top=None, wspace=None,hspace=None)
(2)fig.tight_layout(h_pad=None,w_pad=None)
举个例子:
不合格的代码:
import matplotlib.pyplot as pltfig,axes = plt.subplots(2,2)axes[0,0].plot([1,2],[1,2])axes[0,1].plot([1,2],[1,2])axes[1,0].plot([1,2],[1,2])axes[1,1].plot([1,2],[1,2])axes[0,0].set_xlabel(\"x-label\")axes[0,0].set_ylabel(\"y-label\")axes[0,0].set_title(\"title\")axes[0,1].set_xlabel(\"x-label\")axes[0,1].set_ylabel(\"y-label\")axes[0,1].set_title(\"title\")axes[1,0].set_xlabel(\"x-label\")axes[1,0].set_ylabel(\"y-label\")axes[1,0].set_title(\"title\")axes[1,1].set_xlabel(\"x-label\")axes[1,1].set_ylabel(\"y-label\")axes[1,1].set_title(\"title\")plt.show()
合格的代码:
def plot_fig(ax):ax.plot([1,2],[1,2])ax.set_xlabel(\"x-label\")ax.set_ylabel(\"y-label\")ax.set_title(\"title\")fig,axes = plt.subplots(2,2)plot_fig(axes[0,0])plot_fig(axes[0,1])plot_fig(axes[1,0])plot_fig(axes[1,1])# wspace:width space hspace:height space# fig.subplots_adjust(wspace=1,hspace=1)# 自动调整# h_pad:height padding w_pad:width paddingfig.tight_layout(h_pad=4,w_pad=5)plt.show()
6.5 自定义布局
- 简单的自定义布局:
plt.figure()ax1 = plt.subplot(221)ax2 = plt.subplot(223)ax3 = plt.subplot(122)
- 复杂的自定义布局:
- fig.add_gridspec(2,2):创建栅栏模式
- fig.add_subplot:添加子图
fig = plt.figure()gs = fig.add_gridspec(2,2)# [行,列] [0,0] 取一整行 列取全部fig.add_subplot(gs[0,:])fig.add_subplot(gs[1,0])fig.add_subplot(gs[1,1])
3.** fig.add_gridspec(2,2,width_ratios=width,height_ratios=height)**:调整子图的比例
fig = plt.figure()width = (2,1) # 宽为2:1 0列:1列 的宽度 2:1height = (2,1) # 高为2:1 0行:1行 的高度 2:1gs = fig.add_gridspec(2,2,width_ratios=width,height_ratios=height)# [行,列] [0,0] 取一整行 列取全部fig.add_subplot(gs[0,:])fig.add_subplot(gs[1,0])fig.add_subplot(gs[1,1])
总结
- plt.hist(x, bins=None):绘制以x为数值,bins为组数的直方图
- plt.pie(x,explode=None,labels=None ):绘制扇形图
- plt.boxplot():绘制箱型图
- plt.polar():绘制雷达图
- set_xlim:设置x轴最大值和最小值
set_ylim:设置y轴最大值和最小值 - text():添加文本
- ax2 = ax1.twinx():绘制双y轴
- ax1.yaxis.set_label_coords(x,y):设置y轴label位置
- ax1.minorticks_on():显示子刻度
- fig.tight_layout(h_pad=None,w_pad=None):调整子图间距
- fig.add_gridspec(2,2):创建栅栏模式
- fig.add_subplot:添加子图
- fig.add_gridspec(2,2,width_ratios=width,height_ratios=height):调整子图的比例