Python 从入门到实战46(Matplotlib绘制常用表)
我们的目标是:通过这一套资料学习下来,可以熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。
上篇文章我们学习了pandas数据操作的相关基础知识。今天学习一下Matplotlib绘制常用表的相关操作。
Matplotlib是一个python 2D绘图库,常用于数据可视化。只需要很少的几行代码就可以绘制各种各样的图标,如柱形图、折线图、散点图、饼形图等。
1、绘制柱形图
柱形图,又称长条图、柱形图、条状图等,是一种以长方形的长度为变量的统计图表。柱形图用来比较两个或以上的数据。只有一个变量,通常用于较小的数据集分析。
Matplotlib 绘制柱形图主要使用bar()函数,语法格式如下:
matplotlib.pyplot.bar(x,height,width,bottom=None,*,align=’center’,data=None,**kwargs)
参数说明:
x: x轴数据
height:柱子的高度,也就是Y轴数据
width:浮点型,柱子的宽度,默认值是0.8,可以指定固定值
bottom:标量或数组,可选参数,柱形图的y坐标,默认值为None
*:星号本身不是参数。星号表示其后面的参数为命名关键字参数,命名关键字参数必须传入参数名,否在程序会出现错误。
align:对齐方式,如center—居中,edge—边缘,默认值center
data:data 关键字参数,如果给定一个数据参数,所有位置和关键字参数将被替换
** kwargs:关键字参数,如color—颜色,alpha—透明度,label—每个柱子显示的标签。
举例说明:
假如数据为:
年份 | 销售额 |
2018年 | 500.00 |
2019年 | 600.00 |
2020年 | 700.00 |
2021年 | 800.00 |
2022年 | 900.00 |
2023年 | 1,000.00 |
2024年 | 1,100.00 |
绘制柱形图:
import pandas as pd #导入pandas 模块
import matplotlib.pyplot as plt #导入matplotlib.pyplot 模块
df =pd.read_excel("./test_data/sales_data.xlsx") #读取数据
plt.rcParams["font.sans-serif"]=["SimHei"] #解决中文乱码
x = df["年份"] #x轴数据
height = df["销售额"] #柱子的高度
plt.grid(axis="y",which="major") #生成虚线网络
#x,y轴标签设定
plt.xlabel("年份")
plt.ylabel("线上销售额(元)")
#图表的标题
plt.title("2018-2024销售额")
#绘制柱形图,width 柱子宽度,align 居中对齐,color 为柱子颜色,alpha 为透明度
plt.bar(x,height,width=0.5,align="center",color="b",alpha=0.5)
#设置每个柱子的文本标签
for a,b in zip(x,height):
plt.text(a,b,format(b,","),ha="center",va="bottom",fontsize=9,color="b",alpha=0.9)
plt.legend(["销售额"]) #设置图例
plt.show() #显示图表
执行结果:
2、绘制折线图
折线图可以显示随时间变化的连续数据,因此非常适用于显示在相等时间间隔下数据的趋势。
在折线图中,类别数据沿水平轴均匀分布,所有值数据沿垂直轴均匀分布。Matplotlib 主要使用plot()函数绘制折线图,语法:
matplotlib.pyplot.plot(x,y,format_string,**kwargs)
说明如下:
x: x轴数据
y: y轴数据
format_string:控制曲线格式的字符串,包含颜色、线条样式,标记样式
**kwargs:附加参数,用于设置自动图例、线宽、标记颜色等
label ---数据标签
color---折线颜色
maker—标记样式
linestyle---折线样式
mfc---标记填充颜色
ms---标记大小
alpha---透明度,设置该参数可以改变颜色的深浅
举例说明:
import pandas as pd #导入pandas 模块
import matplotlib.pyplot as plt #导入matplotlib.pyplot 模块
df1 = pd.read_excel("./test_data/scores_data.xlsx") #读取excel中数据,读出的数据是DataFrame格式
#绘制多折线图,每个学科的成绩一条折线,学生姓名为x轴
x1 = df1["姓名"] #取出姓名的一列
y1 = df1["语文"]
y2 = df1["数学"]
y3 = df1["英语"]
plt.rcParams["font.sans-serif"]=["SimHei"] #解决中文乱码
plt.rcParams["xtick.direction"]="out" #x 轴的刻度线向外显示
plt.rcParams["ytick.direction"]="in" #y 轴的刻度线向内显示
#图表的标题
plt.title("语数外成绩比较图",fontsize="18")
#绘制语文折线图
plt.plot(x1,y1,label="语文",color='r',marker="p")
#绘制数学折线图
plt.plot(x1,y2,label="数学",color='g',marker=".",mfc="r",ms=8,alpha=0.6)
#绘制英文折线图
plt.plot(x1,y3,label="英语",color='b',marker="*",linestyle="-")
plt.grid(axis="y") #显示网络关闭y轴
plt.ylabel("分数") #y轴标签
plt.yticks(range(50,150,10)) #y轴刻度值范围设定
plt.legend(["语文","数学","英语"]) #设置图例
plt.show() #显示图表
执行结果:
3、绘制散点图
散点图是用来查看数据的分布情况或相关性,一般用在线性回归分析中,以查看数据点在坐标系平面上的分布情况。散点图表示因变量随自变量变化的大致趋势。
matplotlib 绘制散点图使用plot()和scatter()函数可以实现。
scatter()函数语法:
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, *, edgecolors=None, plotnonfinite=False, data=None, **kwargs)
属性 | 参数 | 意义 | |
坐标 | x,y | 输入点列的数组,长度都是size | |
点大小 | s | 点的直径数组,默认直径20,长度最大size | |
点颜色 | c | 点的颜色,默认蓝色 'b',也可以是个 RGB 或 RGBA 二维行数组。 | |
点形状 | marker | MarkerStyle 点的样式,默认小圆圈 'o'。 | |
调色板 | cmap | Colormap,默认 None,标量或者是一个 colormap 的名字,只有 c 是一个浮点数数组时才使用。如果没有申明就是 image.cmap。 | |
亮度(1) | norm | Normalize,默认 None,数据亮度在 0-1 之间,只有 c 是一个浮点数的数组的时才使用。 | |
亮度(2) | vmin,vmax | 亮度设置,在 norm 参数存在时会忽略。 | |
透明度 | alpha | 透明度设置,0-1 之间,默认 None,即不透明 | |
线 | linewidths | 标记点的长度 | |
颜色 | edgecolors | 颜色或颜色序列,默认为 'face',可选值有 'face', 'none', None。 | |
其他参数 | **kwargs | 其它可选参数 |
举例说明:
import pandas as pd #导入pandas 模块
import matplotlib.pyplot as plt #导入matplotlib.pyplot 模块
df1 = pd.read_excel("./test_data/sales_advise_data.xlsx") #读取excel中数据,读出的数据是DataFrame格式
x = df1["支出"] #取出“支出”这一列的数据
y = df1["收入"]
plt.rcParams["font.sans-serif"]=["SimHei"] #解决中文乱码
plt.title("销售收入和广告费散点图")
plt.ylabel("销售收入") #y轴标签
plt.xlabel("广告费之处") #x轴标签
plt.scatter(x,y,color="red",alpha=0.5)#真实值散点图
plt.show() #显示图片
执行结果:
4、绘制饼形图
饼形图常用来显示各个部分在整体所占的比例。例如,我们测试工作中发现了很多bug,我们可以对bug类型进行分类,然后计算每类bug占总bug数的比例。以此确定主要问题类型。这样,若是通过比例的表格形式展示出来就不直观,若是使用饼形图来表示就一目了然了!
Matplotlib 绘制饼形图主要使用pie()函数,语法:
pie(
x: ArrayLike,
explode: ArrayLike | None = None,
labels: Sequence[str] | None = None,
colors: ColorType | Sequence[ColorType] | None = None,
autopct: str | Callable[[float], str] | None = None,
pctdistance: float = 0.6,
shadow: bool = False,
labeldistance: float | None = 1.1,
startangle: float = 0,
radius: float = 1,
counterclock: bool = True,
wedgeprops: dict[str, Any] | None = None,
textprops: dict[str, Any] | None = None,
center: tuple[float, float] = (0, 0),
frame: bool = False,
rotatelabels: bool = False,
*,
normalize: bool = True,
hatch: str | Sequence[str] | None = None,
data=None,
)
参数说明:
- x:一维数据,通常是一个列表或者数组,表示饼图的每部分的数值。
- explode:同样大小的数组,指定饼图各部分分离多远。
- labels:提供饼图每部分的标签的字符串列表。
- colors:设置饼图每部分的颜色。
- autopct:格式字符串或者返回字符串的函数,用于标注每部分的比例。
- pctdistance:标注比例距离饼图中心的距离。
- shadow:布尔值,是否显示阴影。默认是False
- labeldistance:文本标签与圆的半径的距离。
- startangle:起始绘制的角度,默认是从x轴正方向逆时针方向开始。
- radius:定义饼图的半径大小。
- counterclock:是否使用逆时针方向标签。默认值为True表示逆时针
- wedgeprops:字典,用于设置扇形的属性,如边界颜色、宽度等。
- textprops:字典,用于设置文本标签的属性,如字体大小、颜色等。
- center:一个元组,定义饼图的中心位置。
举例说明:
import pandas as pd #导入pandas 模块
import matplotlib.pyplot as plt #导入matplotlib.pyplot 模块
#绘制饼形图
df1 = pd.read_excel("./test_data/pie_shengshi_data.xlsx") #读取excel中数据,读出的数据是DataFrame格式
plt.rcParams["font.sans-serif"] = ["SimHei"] #解决中文乱码
plt.figure(figsize=(5,3)) #设置画布大小
labels = df1["省"] #饼图标签,取省那一列值
sizes = df1["销量"] #饼图数据,不需要计算成比例
#设置饼图中每个扇形的颜色
colors = ["red","yellow","slateblue","green","magenta","cyan","darkorange","lawngreen","pink","gold"]
plt.pie(sizes, #饼图数据
labels = labels, #添加区域水平标签
colors = colors,
labeldistance= 1.02, #设置扇形标签(图例)与圆心的距离
autopct = "%.1f%%",#设置百分比的格式,保留一位小数
startangle=90, #设置饼图的初始角度
radius=0.5,#设置饼图的半径
center=(0.2,0.2), #设置饼图的原点
textprops={"fontsize":9,"color":"k"}, #设置文本标签的属性值
pctdistance=0.6 #设置百分比标签与圆心的距离
)
plt.axis("equal") #设置x,y轴刻度一致,保证饼图为圆形
plt.title("2024年12月各省、区或市占销售比情况分析") #标题
plt.show() #展示图片
执行结果:
今天先写学习到这里了,每天进步一点点。明天也要加油啊!