找回密码
 立即注册
搜索
热搜: 活动 交友
查看: 269|回复: 1

matplotlib基本使用

[复制链接]

2

主题

3

回帖

180

积分

初级程序员

积分
180
发表于 5-31-2025 12:40:33 | 显示全部楼层 |阅读模式
本帖最后由 BZR 于 5-31-2025 19:42 编辑

看到有大佬讲解Pandas,那我就说一下matplotlib吧
matplotlib同Pandas一样,都是Python的第三方工具包(库);Pandas注重数据操作与分析,而matplotlib注重于数据可视化。说白了就是2D 3D表格。
首先如何安装:打开Terminal控制台,输入pip install matplotlib或pip3 install matplotlib即可。
如果pip太慢,可以用国内镜像源安装:python3 -m pip install —upgrade matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
方便提供数据,建议再安装一个NumPy:pip3 install numpy
调用
要调用我们安装的matplotlib和NumPy,直接
  1. import numpy
  2. import maplotlib
复制代码
但一般我们嫌工具包名字太长,会 import ... as ...,这样使用的时候直接用as后的名称就可以了
  1. import numpy as np
  2. import matplotlib as plt
复制代码

2D作图
注:以下内容参考https://www.youtube.com/watch?v=OZOOLe2imFo&t=2642s
1. 散点图 Scatter Plot
我们先用numpy搞出x、y两组数据(np.random.random(x) * (y): 生成x个随机数值,范围0~y)
  1. x_data = np.random.random(50) * 100 # 生成50个随机数值,范围0~100
  2. y_data = np.random.random(50) * 100
复制代码

散点图绘制格式:
plt.scatter(x数据, y数据, c = 颜色(名称、RGB、缩写均可), marker = 图标(默认为点),
            s = 点大小(默认100), alpha = 透明度(默认1,不透明))

例如,用我们生成的x、y数据来做一个散点图:
  1. plt.scatter(x_data, y_data, c = 'blue', s = 120, alpha = 0.3)
复制代码
而matplotlib需要单独的指令来显示做出的图表:
  1. plt.show()
复制代码
输出的散点图就像这样:
2. 折线图 Line plot

假设我们要观察每年中国成年人平均体重:
  1. years = [2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025]
  2. weights = [80, 80.7, 85, 84, 87, 82, 84.5, 89.2, 93, 88]
复制代码

折线图绘制格式:
plt.plot(x数据, y数据, c = 颜色(名称、RGB、缩写), lw = 线粗,
        linestyle = 线型)
linestyle:
    '-', 'solid' 实线(默认)
    '--', 'dashed' 虚线
    '-.', 'dashdot' 线点
    ':', 'dotted' 点
    'None', ' ', '' 无

例如,用years和weights生成折线图:
  1. plt.plot(years, weights, c = 'red', lw = 3, linestyle = ':')
  2. plt.show()
复制代码

3. 柱状图 Bar graph
假设我们要统计每个编程语言的投票数:
  1. languages = ['C++', 'C#', 'Python', 'Java', 'Go', 'Scratch']
  2. votes = [133, 53, 156, 91, 73, 104]
复制代码

柱状图绘制格式:
plt.bar(x数据, y数据, color = 颜色(名称、RGB、缩写), align = x标位置,
        edgecolor = 柱边线颜色, lw = 柱边线宽, width = 柱宽)
align:
    'center' 中心(默认)
    'edge' 左侧

根据我们设置的数据,生成一个柱状图:
  1. plt.bar(languages, votes, color = 'yellow', align = 'edge', edgecolor = 'black', lw = 2, width = 0.5)
  2. plt.show()
复制代码

4. 直方图 Histogram直方图与别的图表不同的是,它只需要一组数据,因为直方图一般是用横轴表示数据类型,而纵轴是表示分布情况。

比如,我们先用numpy生成一组数据:
  1. ages = np.random.normal(20, 1.5, 1000) # 生成1000个平均值为20的数,平均差值为1.5
复制代码

直方图绘制格式:
plt.hist(数据, bins = 区间的数量 或 [每个区间的具体数值],
        cumulative = 是否为累计直方图)

其中,累计直方图是一种阶梯状的直方图,更清晰地表示小于等于区间上限的数据点,比如:
  1. plt.hist(ages, bins = 20, cumulative = True)
复制代码

当然,试试正常直方图,并且指定直方图每个区间的具体数值:
  1. plt.hist(ages, bins = [min(ages), 18, 20, 22, max(ages)], cumulative = False)
复制代码

可以看到,min(ages)应该是图中最左边的区间,大约是15;然后是18、20、22;最后max(ages)在最右边,大约是25。
(当然,因为我们只指定了5个区间,所以直方图不是很好看...)

5. 饼图 Pie Chart
作一个饼图,我们还是用刚才的编程语言投票:
  1. languages = ['C++', 'C#', 'Python', 'Java', 'Go', 'Scratch']
  2. votes = [123, 53, 166, 91, 73, 104]
复制代码

饼图绘制格式就比较复杂了:
explodes = [x * 0~1](多少数据多少数值,不突出的值为0,突出的值>0)
plt.pie(数据名, labels = 标签名/None, explode = explodes,
        autopct(显示占比) = '%.nf%%'(n位小数), pctdistance = 占比数字离标签的距离,
        startangle = 饼图开始角度)

做点说明:
explode用来表示饼图中我们想要强调的区块,explodes值>0的区块会在原来位置向外偏离一点。(就像被炸出去了一样,是不是很贴切?)
startangle是指饼图开始绘制时的初始角度,matplotlib绘制饼图是是从列表中第一个数值开始逆时针绘制。就比如当startangle = 90时,第一个区块的右边线就会是90度。
例如:
  1. explodes = [0, 0, 0.3, 0, 0, 0]
  2. plt.pie(votes, labels = languages, explode = explodes, autopct = '%.2f%%', pctdistance = 0.8, startangle = 90)
  3. plt.show()
复制代码

在这张饼图中,Python项的explode值是0.3,所以它的区块就“炸”出去了一点。autopact = '%.2f%%',所以占比就近似到了两位小数。startangle = 90,所以C++那一区块的右边线就是垂直的。
表格改制 Customizing Plots
现在我们所制作的表格都只是——表格(bruh),没有标题 title、标签 label、图例 legend 等重要元素。所以我们要进行改制。
我们来作一个刘老师年收入的折线图并加上标签。(如果数据不准确欢迎指正 lol)
先简单绘制一个折线图:
  1. years = [2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025]
  2. incomes = [550, 560, 630, 610, 720, 780, 810, 850, 840, 850]
  3. plt.plot(years, incomes)
复制代码
当然,刘老师的年收入不可能是八百多块钱,所以我们要加标签:
  1. plt.xlabel('Year') # x坐标名称
  2. plt.ylabel('Yearly income in k-RMB') # y坐标名称
复制代码
这样刘老师的年收入就被我们澄清成2024赚85万元了。
我们再给这个折线图一个标题:
  1. plt.title('Income of Mr. Liu', fontsize = 20, fontname = 'Times New Roman') # 表格名称
复制代码
最后再生成:
  1. plt.show()
复制代码

接下来,我们再绘制一个有图例的重叠表格:
绘制含有多组信息的重叠表格很简单,只需要把所有要展示的信息都标下来,最后再显示就可以了。
我们先给定三个公司的股票数据:
  1. stockA = [100, 102, 99, 101, 101, 100, 103]
  2. stockB = [98, 95, 100, 98, 102, 103, 101]
  3. stockC = [70, 71, 79, 84, 93, 101, 75]
复制代码
我们在将它添加到折线图中,并添加图例:
  1. plt.plot(stockA, label = 'Company A')
  2. plt.plot(stockB, label = 'Company B')
  3. plt.plot(stockC, label = 'Company C')
复制代码
注意:添加完图例之后一定要再写上
  1. plt.legend()
复制代码
最后再显示出来:
  1. plt.show() # 同时显示3条折线
复制代码

这样就可以了!到此为止用matplotlib绘制一些常见的二维图表就基本上结束了。当然,matplotlib可以绘制一些比较“高级”的二维图表,比如平面直角坐标系、热力图、风向图等等。但因为操作和定义起来比较繁琐,我个人推荐用别的工具包去绘制,在这条帖子就不赘述了。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

2

主题

3

回帖

180

积分

初级程序员

积分
180
 楼主| 发表于 6-4-2025 19:11:39 | 显示全部楼层
我才发现我抢了Kelvin的下期内容......
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RealDevClub ( 沪ICP备2024093864号-1 )

GMT+8, 6-26-2025 23:54 , Processed in 0.081942 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表