matplot制图方法合集

本随笔是matplot制图的保姆级教程,主要学习自尚硅谷的bilibili视频,欢迎学习

1、折线图 plot

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#设置字体
from matplotlib import rcParams
rcParams['font.family']="Microsoft YaHei"
#创建图表、设置大小
plt.figure(figsize=(8,4))
#设置数据
month=['1月','2月','3月','4月']
sales=[100,120,130,80]
#绘制plot
plt.title("2026sales趋势",fontsize="15")  #标题
plt.plot(month,sales,label="产品A",color="#B72E2EB3",linewidth="2",linestyle="-",marker="o")
#添加坐标轴的标签
plt.xlabel("月份",fontsize=10)
plt.ylabel("销售额(万元)",fontsize=10)
#添加图例
plt.legend(loc="upper left")
#添加网格线
# plt.grid(axis="y")   #(or"x")
plt.grid(alpha=0.5,color="black",linestyle="--")#透明度,颜色,虚线(-实线,--虚线)
#设置刻度字体大小与旋转
plt.xticks(rotation=30,fontsize="12")
plt.yticks(rotation=0,fontsize="12")
#设置y轴范围
plt.ylim(75,145)
#在每个数据点显示数值
for x,y in zip(month,sales):
    plt.text(x,y+1,str(y),ha="center",va="bottom")
#显示图表
plt.show()

output1

2、柱状图 bar

import matplotlib.pyplot as plt
#设置字体
from matplotlib import rcParams
rcParams['font.family']="Microsoft YaHei"
#创建图表、设置大小
plt.figure(figsize=(8,4))
#设置数据
subject=['语文','数学','英语','科学']
score=[98,90,60,80]
plt.bar(subject,score,label="小明",color="#3960A8",width=0.6)
plt.title("小明的成绩单",fontsize="15")  #标题
plt.xlabel("科目",fontsize="12")
plt.ylabel("分数",fontsize="12")
plt.grid(axis="y",alpha=0.2,color="black",linestyle="--")
plt.xticks(rotation=0,fontsize="12")
plt.yticks(rotation=0,fontsize="12")
plt.ylim(0,105)
for x,y in zip(subject,score):
    plt.text(x,y+1,str(y),ha="center",va="bottom",fontsize=10)
plt.legend(loc="upper right")
# plt.tight_layout() #这个函数可以自动优化排版,不过效果不明显
plt.show()

output2

3、横向条形图 barh

import matplotlib.pyplot as plt
#设置字体
from matplotlib import rcParams
rcParams['font.family']="Microsoft YaHei"
#创建图表、设置大小
plt.figure(figsize=(8,4))
#设置数据
subject=['语文','数学','英语','科学']
score=[98,90,60,80]
plt.barh(subject,score,label="小明",color="#559068",height=0.5)
plt.title("小明的成绩单",fontsize="15")  #标题
plt.xlabel("分数",fontsize="12")
plt.ylabel("科目",fontsize="12")
plt.grid(axis="x",alpha=0.2,color="black",linestyle="--")
plt.xticks(rotation=0,fontsize="12")
plt.yticks(rotation=0,fontsize="12")
plt.xlim(0,105)
for x,y in zip(score,subject):
    plt.text(x+2,y,str(x),ha="center",va="bottom",fontsize=15)
plt.legend(loc="upper right")
# plt.tight_layout() 
plt.show()

output3

4、直方图 hist

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import rcParams
rcParams['font.family'] = "Microsoft YaHei"
# 1. 准备数据:模拟1000个学生的成绩(正态分布,平均分70,标准差10)
np.random.seed(42)  # 设置随机种子,保证每次运行结果一样
scores = np.random.normal(loc=70, scale=10, size=1000)
# 2. 绘制直方图
plt.figure(figsize=(8, 4))  # 设置画布大小
n, bins, patches = plt.hist(
    scores,          # 数据
    bins=100,         # 分成100个柱子(区间)
    edgecolor='black', # 柱子边框颜色,让分界更清晰
    color='#87CEEB',  # 柱子填充颜色
    alpha=0.7        # 透明度
)
# 3. 添加图表信息
plt.title('班级考试成绩分布直方图', fontsize=14)
plt.xlabel('分数', fontsize=12)
plt.ylabel('学生人数', fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.5) # 添加横向网格线
# 4. 显示图表
plt.show()

#5.拓展:hist返回值
# print("--- 每个区间的人数 ---")
# print(n)
# print("\n--- 区间边界 ---")
# print(bins.round(2))
# print("\n--- 柱子对象 ---")
# print(patches)

output4

5、饼状图 pie

5.1 饼状图
import matplotlib.pyplot as plt
from matplotlib import rcParams
rcParams['font.family']="Microsoft YaHei"
plt.figure(figsize=(5,6))
#设置数据
apps=['Bilibili','Brawler Stars','Wechat','Douyin','Others']
times=[100,50,28,12,87]
colors1=["#66df66","#d2d521bf","#28aebc","#763e3e","#4628bb"]
#突出块设置
explode=[0.06,0,0,0,0]
plt.pie(times,
        labels=apps,
        autopct="%.2f%%",   #显示百分比
        startangle=-60,     #旋转一定角度
        colors=colors1,
        explode=explode,    #突出块
        shadow=True         #产生立体感阴影
        ),
plt.title("健康使用手机",fontsize="15")
plt.tight_layout()
plt.show()

output5

5.2 圆环图
plt.figure(figsize=(5,6))
plt.pie(times,
        labels=apps,
        autopct="%.2f%%",
        startangle=-60,
        colors=colors1,
        wedgeprops={"width":0.66},#制造环状图并调节缺口比例
        pctdistance=0.8,          #调整中心pct到中心点的距离
        explode=explode,          #突出块设置
        shadow=1                  #产生立体感阴影
        )
plt.title("健康使用手机",fontsize="15")
#用text函数在中心写字
plt.text(0,-0.08,"Sum=100%",ha="center",va="bottom",fontsize=15,color="g")
plt.tight_layout()
plt.show()

output6

6、散点图 scatter

import matplotlib.pyplot as plt
import random as rd
from matplotlib import rcParams
rcParams['font.family']="Microsoft YaHei"
plt.figure(figsize=(8,4))
#设置数据
x=[]
y=[]
for i in range(500):
    tmp=rd.uniform(0,10)
    x.append(tmp)
    y.append(tmp*1.5+rd.gauss(0,0.6))
#绘制scatter
plt.title("Operation datas",fontsize="15")
plt.scatter(x,y
            ,label="产品A",
            color="#4796A2B3",
            alpha=0.4,  #样本点透明度
            s=15        #样本点大小
            )
plt.xlabel("X变量",fontsize=15)
plt.ylabel("Y变量",fontsize=15)
#添加网格线
# plt.grid(axis="y")   #(or"x")
plt.grid(alpha=0.4,color="black",linestyle="--")#透明度,颜色,虚线(-实线,--虚线)
#设置刻度字体大小与旋转
plt.xticks(rotation=0,fontsize="12")
plt.yticks(rotation=0,fontsize="12")
# plt.ylim(75,145)  #设置y轴范围
#添加一条拟合线(同一个图中画多条线直接加就行)
plt.plot([0,10],[0,15],color="#ed1a0b",linewidth=2,linestyle="--")
# plt.tight_layout()
plt.show()

output7

7、箱线图 boxplot

import matplotlib.pyplot as plt
from matplotlib import rcParams
rcParams['font.family']="Microsoft YaHei"
#创建图表、设置大小
plt.figure(figsize=(8,4))
#设置数据
data={
    "语文":[82,95,88,70,90,76,78,76,56],
    "数学":[90,98,79,67,97,95,90,88,86],
    "英语":[70,72,68,65,78,66,56,90,99]
}
plt.title("各科成绩分布箱线图",fontsize="15")  #标题
plt.boxplot(data.values(),tick_labels=data.keys())
#添加坐标轴的标签
plt.xlabel("学科",fontsize=15)
plt.ylabel("分数",fontsize=15)
#添加网格线
# plt.grid(axis="y")   #(or"x")
plt.grid(alpha=0.4,color="black",linestyle="--")#透明度,颜色,虚线(-实线,--虚线)
#设置刻度字体大小与旋转
plt.xticks(rotation=0,fontsize="12")
plt.yticks(rotation=0,fontsize="12")
# plt.ylim(75,145)  #设置y轴范围
plt.tight_layout()
plt.show()

output8

8、多个图的绘制方法 subplot()

import matplotlib.pyplot as plt
from matplotlib import rcParams
rcParams['font.family']="Microsoft YaHei"
plt.figure(figsize=(6,4))
month=['1月','2月','3月','4月']
sales=[100,120,130,80]
f1=plt.subplot(2,2,1)   #2行2列的第一个格子
f1.plot(month,sales)
f2=plt.subplot(2,2,2)
f2.bar(month,sales)
f3=plt.subplot(2,2,3)
f3.scatter(month,sales)
f4=plt.subplot(2,2,4)     #可以省略逗号
f4.pie(sales,
        labels=month,
        autopct="%.2f%%",   #显示百分比
        startangle=-20,     #旋转一定角度
        colors=colors1,
        explode=[0.1,0,0,0],
        shadow=True         #产生立体感阴影
        )
plt.show()

output9

9、整合包Seaborn的使用

9.1 直方图

直方图 histplot

计数图 countplot 与之类似 但不能使用kde

import seaborn as sns
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rcParams
rcParams['font.family']="Microsoft YaHei"
#导入数据
sns.set_palette("Set2")
df1=pd.read_csv("data/sns_data.csv")
df1.head()
EmployeeID birthdate_key age city_name department job_title gender
0 1318 1/3/1954 61 Vancouver Executive CEO M
1 1319 1/3/1957 58 Vancouver Executive VP Stores F
2 1320 1/2/1955 60 Vancouver Executive Legal Counsel F
3 1321 1/2/1959 56 Vancouver Executive VP Human Resources M
4 1322 1/9/1958 57 Vancouver Executive VP Finance M
plt.figure(figsize=(5,3))
sns.histplot(df1,x="department",kde=True);#kde代表核密度分布曲线开关

output10

#横向直方图
plt.figure(figsize=(5,3))
sns.histplot(df1,y="city_name",kde=True);

output11

9.2 散点图
penguins=pd.read_csv("data/penguins.csv")
penguins.head()
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex
0 Adelie Torgersen 39.1 18.7 181.0 3750.0 Male
1 Adelie Torgersen 39.5 17.4 186.0 3800.0 Female
2 Adelie Torgersen 40.3 18.0 195.0 3250.0 Female
3 Adelie Torgersen NaN NaN NaN NaN NaN
4 Adelie Torgersen 36.7 19.3 193.0 3450.0 Female
plt.figure(figsize=(5,3))
sns.scatterplot(penguins,x="body_mass_g",y="bill_depth_mm",hue="sex");

output12

9.3 蜂窝图
#通过jointplot()函数,设置kind="hex"来绘制蜂窝图。
sns.jointplot(data=penguins, x="body_mass_g", y="flipper_length_mm", kind="hex");

output13

9.4二维核密度估计图
#通过kdeplot()函数,同时设置x参数和y参数来绘制二维核密度估计图。
plt.figure(figsize=(5,3))
sns.kdeplot(data=penguins, x="body_mass_g", y="flipper_length_mm");

output14

#通过fill=True设置为填充,通过cbar=True设置显示颜色示意条。
plt.figure(figsize=(5,3))
sns.kdeplot(data=penguins, x="body_mass_g", y="flipper_length_mm", fill=True, cbar=True);

output15

9.5 条形图
#条形图
plt.figure(figsize=(5,3))
sns.barplot(data=penguins, x="species", y="bill_length_mm", estimator="mean", errorbar=None);

output16

9.6 箱线图
plt.figure(figsize=(5,3))
sns.boxplot(data=penguins, x="species", y="bill_length_mm");

output17

9.7 小提琴图
plt.figure(figsize=(5,3))
'''小提琴图Violin Plot 是一种结合了箱线图和核密度估计图KDE的可视化图表,
用于展示数据的分布情况、集中趋势、散布情况以及异常值。小提琴图不仅可以显示数据的基本统计量(如中位数和四分位数),
还可以展示数据的概率密度,提供比箱线图更丰富的信息
'''
sns.violinplot(data=penguins, x="species", y="bill_length_mm");

output18

9.8 成对关系图
'''成对关系图是一种用于显示多个变量之间关系的可视化工具。它可以展示各个变量之间的成对关系,
并且通过不同的图表形式帮助我们理解数据中各个变量之间的相互作用。
对角线上的图通常显示每个变量的分布(如直方图或核密度估计图),
帮助观察每个变量的单变量特性。其他位置展示所有变量的两两关系,用散点图表示。
'''
sns.pairplot(data=penguins, hue="species");

output19

posted @ 2026-03-07 22:20  wangzy336  阅读(19)  评论(2)    收藏  举报