知识周汇 | 用 matplotlib 轻松绘制折线图、散点图、柱状图、直方图

目录

前言

折线图

散点图

柱状图

直方图

组合图:柱状图和折线图

[1. 导入库](#1. 导入库)

[2. 定义组合图函数](#2. 定义组合图函数)

[3. 设置中文字体和样式](#3. 设置中文字体和样式)

[4. 创建画布和子图](#4. 创建画布和子图)

[5. 绘制柱状图](#5. 绘制柱状图)

[6. 绘制折线图](#6. 绘制折线图)

[7. 美化图表](#7. 美化图表)

[8. 保存和显示图表](#8. 保存和显示图表)

[9. 调用函数](#9. 调用函数)

总结


前言

matplotlib 是 Python 中最常用的绘图库之一,无论是数据分析还是科研绘图,它都能轻松搞定。今天我们就来学习如何使用 matplotlib 绘制四种常见的图表:折线图散点图柱状图 和 **直方图和组合图(柱状图和折线图),**并重点讲解组合图。

折线图

python 复制代码
import matplotlib.pyplot as plt
import random

from pylab import mpl

mpl.rcParams["font.sans-serif"] = ["SimHei"]  # 设置显示中文字体
mpl.rcParams["axes.unicode_minus"] = False  # 设置正常显示符号

# 数据准备
x = range(24)
y = [random.uniform(13, 20) for i in x]  # random.uniform():随机生成13-20范围内的浮点数

plt.figure(figsize=(10, 5), dpi=80)  # 创建画布
plt.plot(x, y, color='y', linestyle='-', label='温度')  # 绘制折线图

x_ticks_label = ["{}:00".format(i) for i in x]  # 构建x轴刻度标签
y_ticks = range(40)  # 构建y轴刻度

# 修改x,y轴坐标的刻度显示
plt.xticks(x[::2], x_ticks_label[::2])
plt.yticks(y_ticks[10:20:1])

plt.grid(True, linestyle='-', alpha=0.9)  # 添加网格
plt.legend(loc=0)  # 显示图例

# 描述信息
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("24小时内温度变化图", fontsize=18)

plt.savefig("./plot.jpg")  # 保存至指定位置
plt.show()  # 显示图像

效果展示

散点图

python 复制代码
import matplotlib.pyplot as plt
import random
from pylab import mpl

mpl.rcParams["font.sans-serif"] = ["SimHei"]  # 设置显示中文字体
mpl.rcParams["axes.unicode_minus"] = False  # 设置正常显示符号

# 数据准备
x = range(100)
y = [random.uniform(13, 20) for i in x]  # random.uniform():随机生成13-20范围内的浮点数

plt.figure(figsize=(10, 5), dpi=80)  # 创建画布
plt.scatter(x, y, color='r', linestyle='-', label='樟树')  # 绘制折线图

x_ticks_label = ["{}天".format(i) for i in x]  # 构建x轴刻度标签
y_ticks = range(25)  # 构建y轴刻度

# 修改x,y轴坐标的刻度显示
plt.xticks(x[::10], x_ticks_label[::10])
plt.yticks(y_ticks[10:22:2])

plt.grid(True, linestyle='-', alpha=0.9)  # 添加网格
plt.legend(loc=0)  # 显示图例

# 描述信息
plt.xlabel("时间/天")
plt.ylabel("温度")
plt.title("24小时内温度变化图", fontsize=18)

plt.savefig("./scatter.jpg")  # 保存至指定位置
plt.show()  # 显示图像

效果展示

柱状图

python 复制代码
import matplotlib.pyplot as plt
import random

from pylab import mpl
mpl.rcParams["font.sans-serif"] = ["SimHei"]  # 设置显示中文字体
mpl.rcParams["axes.unicode_minus"] = False  # 设置正常显示符号

# 数据准备
x = range(0, 10)
y = [random.randint(35, 45) for i in x]  # random.uniform():随机生成13-20范围内的浮点数

plt.figure(figsize=(10, 5), dpi=80)  # 创建画布
plt.bar(x, y, width=0.5, color=['b', 'r', 'g', 'y', 'c', 'm', 'y', 'k', 'c', 'g'])  # 绘制折线图

x_ticks_label = ["21{}班".format(i) for i in x]  # 构建x轴刻度标签
y_ticks = range(55)  # 构建y轴刻度

# 修改x,y轴坐标的刻度显示
plt.xticks(x[::1], x_ticks_label[::1])
plt.yticks(y_ticks[0:55:5])

plt.grid(True, linestyle=':', alpha=0.3)  # 添加网格

# 描述信息
plt.xlabel("班级")
plt.ylabel("人数")
plt.title("2021级各班人数柱状图", fontsize=18)

plt.savefig("./bar.jpg")  # 保存至指定位置
plt.show()  # 显示图像

效果展示

直方图

python 复制代码
import matplotlib.pyplot as plt
import numpy as np

plt.style.use('_mpl-gallery')

# 生成数据
np.random.seed(1)  # 随机数种子,用于生成随机数
x = 4 + np.random.normal(0, 1.5, 200)
# np.random.normal(loc=0.0, scale=1.0, size=None)  #为一个正态分布
# loc(float):均值,对应着这个分布的中心。loc=0说明这一个以y轴为对称轴的正态分布
# scale(float):标准差,对应分布的宽度,scale越大越矮胖,scale越小,越瘦高
# size(int 或者整数元组):输出的值赋在shape里,默认为None

# plot:

fig, ax = plt.subplots()

ax.hist(x, bins=8, linewidth=0.5, edgecolor="white")

ax.set(xlim=(0, 10), xticks=np.arange(1, 10),
       ylim=(0, 56), yticks=np.linspace(0, 56, 9))  # 9个,包含0,间隔为7,7×8=56,即[0,7,14,21,28,35,42,49,56]
# np.arange():返回一个有终点和起点的固定步长的排列
# np.linspace(start, stop, num):用来创建等差数列,num为个数

plt.savefig("./直方图.jpg")  # 保存至指定位置
plt.show()

效果图

组合图:柱状图和折线图

python 复制代码
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import os


def combination_chart(df=pd.DataFrame({'key': [1, 2, 3], 'data1': [1, 2, 3], 'data2': [4, 5, 6]}),
                      x=[1, 2, 3],
                      x_label='月份', rotation=90, y1=[1, 2, 3], y1_label='金额/元', y2=[1, 2, 3],
                      y2_label='数量', picture_save=os.path.abspath(r'.')):
    # 生成图表
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 中文字体设置-黑体
    plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
    sns.set(font='SimHei', style='dark')  # 解决Seaborn中文显示问题

    ax = plt.subplot(1, 1, 1)
    # 设置图形大小
    plt.rcParams['figure.figsize'] = (14, 4)
    fig = plt.figure()
    # 画柱形图
    ax1 = fig.add_subplot(1, 1, 1)
    ax1.set_ylim([0, max(y1) * 1.4])
    ax1.bar(x, y1, alpha=0.6, color=sns.color_palette('Blues_r', df.shape[0]))
    ax1.set_ylabel(y1_label, fontsize='11')
    ax1.set_xlabel(x_label, fontsize='11')
    ax1.tick_params(labelsize=11)
    for _x, _y in zip(x, y1):
        plt.text(_x, _y, int(_y), color='black', fontsize=11, ha='center', va='bottom')  # 将数值显示在图形上
    plt.xticks(x, rotation=rotation)  # 设置x刻度

    # 画折线图
    ax2 = ax1.twinx()  # 组合图必须加这个
    ax2.set_ylim([-max(y2) * 1.4, max(y2) * 1.4])
    ax2.plot(x, y2, 'r', ms=5, lw=1, marker='o')  # 设置线粗细,节点样式
    ax2.set_ylabel(y2_label, fontsize='11')
    ax2.tick_params(labelsize=11)
    for x, y in zip(x, y2):  # # 添加数据标签
        plt.text(x, y, int(y), ha='center', va='bottom', fontsize=11, rotation=0)

    sns.despine(left=True, bottom=True, right=True)  # 删除坐标轴,默认删除右上

    plt.savefig(picture_save, dpi=200, bbox_inches='tight')
    plt.show()


combination_chart()

效果图

代码讲解:

1. 导入库

python 复制代码
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import os
  • matplotlib.pyplot:用于绘制图表的核心模块。

  • pandas:用于数据处理和分析。

  • seaborn :基于 matplotlib 的高级绘图库,提供更美观的默认样式。

  • os:用于处理文件路径。


2. 定义组合图函数

python 复制代码
def combination_chart(df=pd.DataFrame({'key': [1, 2, 3], 'data1': [1, 2, 3], 'data2': [4, 5, 6]}),
                      x=[1, 2, 3],
                      x_label='月份', rotation=90, y1=[1, 2, 3], y1_label='金额/元', y2=[1, 2, 3],
                      y2_label='数量', picture_save=os.path.abspath(r'.')):
  • df :默认的 DataFrame,包含 keydata1data2 三列。

  • x :x 轴数据,默认值为 [1, 2, 3]

  • x_label :x 轴标签,默认值为 '月份'

  • rotation :x 轴刻度标签的旋转角度,默认值为 90(垂直显示)。

  • y1 :柱状图的 y 轴数据,默认值为 [1, 2, 3]

  • y1_label :柱状图的 y 轴标签,默认值为 '金额/元'

  • y2 :折线图的 y 轴数据,默认值为 [1, 2, 3]

  • y2_label :折线图的 y 轴标签,默认值为 '数量'

  • picture_save:图表保存路径,默认值为当前目录。


3. 设置中文字体和样式

python 复制代码
plt.rcParams['font.sans-serif'] = ['SimHei']  # 中文字体设置-黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
sns.set(font='SimHei', style='dark')  # 解决Seaborn中文显示问题
  • font.sans-serif :设置字体为 SimHei(黑体),以支持中文显示。

  • axes.unicode_minus:解决负号显示为方块的问题。

  • sns.set :设置 seaborn 的字体和样式。


4. 创建画布和子图

python 复制代码
ax = plt.subplot(1, 1, 1)
plt.rcParams['figure.figsize'] = (14, 4)  # 设置图形大小
fig = plt.figure()
  • plt.subplot(1, 1, 1):创建一个 1x1 的子图。

  • figure.figsize:设置画布大小为宽 14 英寸、高 4 英寸。

  • fig = plt.figure():创建一个新的画布。


5. 绘制柱状图

python 复制代码
ax1 = fig.add_subplot(1, 1, 1)
ax1.set_ylim([0, max(y1) * 1.4])  # 设置y轴范围
ax1.bar(x, y1, alpha=0.6, color=sns.color_palette('Blues_r', df.shape[0]))  # 绘制柱状图
ax1.set_ylabel(y1_label, fontsize='11')  # 设置y轴标签
ax1.set_xlabel(x_label, fontsize='11')  # 设置x轴标签
ax1.tick_params(labelsize=11)  # 设置刻度字体大小
for _x, _y in zip(x, y1):
    plt.text(_x, _y, int(_y), color='black', fontsize=11, ha='center', va='bottom')  # 添加数据标签
plt.xticks(x, rotation=rotation)  # 设置x轴刻度
  • ax1.set_ylim :设置 y 轴范围为 0 到 max(y1) * 1.4

  • ax1.bar:绘制柱状图,颜色为蓝色渐变,透明度为 0.6。

  • plt.text:在每个柱子上方显示数值。

  • plt.xticks:设置 x 轴刻度和旋转角度。


6. 绘制折线图

python 复制代码
ax2 = ax1.twinx()  # 创建第二个y轴
ax2.set_ylim([-max(y2) * 1.4, max(y2) * 1.4])  # 设置第二个y轴范围
ax2.plot(x, y2, 'r', ms=5, lw=1, marker='o')  # 绘制折线图
ax2.set_ylabel(y2_label, fontsize='11')  # 设置第二个y轴标签
ax2.tick_params(labelsize=11)  # 设置刻度字体大小
for x, y in zip(x, y2):
    plt.text(x, y, int(y), ha='center', va='bottom', fontsize=11, rotation=0)  # 添加数据标签
  • ax2 = ax1.twinx():创建第二个 y 轴,用于绘制折线图。

  • ax2.plot:绘制红色折线图,节点为圆形。

  • plt.text:在每个节点上方显示数值。


7. 美化图表

python 复制代码
sns.despine(left=True, bottom=True, right=True)  # 删除坐标轴
  • sns.despine:删除左侧、底部和右侧的坐标轴线。

8. 保存和显示图表

python 复制代码
plt.savefig(picture_save, dpi=200, bbox_inches='tight')  # 保存图表
plt.show()  # 显示图表
  • plt.savefig:将图表保存为图片,分辨率为 200 DPI。

  • plt.show:显示图表。


9. 调用函数

python 复制代码
combination_chart()
  • 调用 combination_chart 函数,使用默认参数生成组合图。

总结

这段代码的核心功能是:

  1. 绘制一个组合图,包含柱状图和折线图。

  2. 柱状图展示 y1 数据,折线图展示 y2 数据。

  3. 支持中文显示、数据标签、双 y 轴等功能。

  4. 保存图表并显示。

通过这段代码,你可以快速绘制一张美观的组合图,并掌握 matplotlibseaborn 的高级用法!

相关推荐
Y1nhl5 分钟前
搜广推校招面经六十二
人工智能·pytorch·python·算法·机器学习·推荐算法·搜索算法
zhanghongyi_cpp16 分钟前
3. 列表元素替换
python
蓝白咖啡20 分钟前
华为OD机试 - 王者荣耀匹配机制 - 回溯(Java 2024 D卷 200分)
java·python·算法·华为od·机试
Code_Geo29 分钟前
pyproj 库中 Geod 类讲解
开发语言·python·geod·pyproj
钢铁男儿41 分钟前
Python 序列构成的数组(对序列使用+和_)
服务器·windows·python
豆芽8191 小时前
基于Web的交互式智能成绩管理系统设计
前端·python·信息可视化·数据分析·交互·web·数据可视化
不爱吃鱼的猫-1 小时前
Pyside6 信号与槽
python·个人开发·pyside6
Suc_zhan1 小时前
实验一 基于支持向量机实现激酶抑制剂的分类
python·算法·支持向量机·分类
不辉放弃1 小时前
Flink/Kafka在python中的用处
大数据·python
BAs5331 小时前
Anaconda Jupyter 默认启动位置修改
ide·python·jupyter·conda