matplotlib——pyplot

本文详细介绍了使用Python的matplotlib库进行折线图、散点图、条形图和直方图的绘制,包括基本操作和高级定制,适用于数据可视化和理解趋势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1. 图像分类

1.1 折线图

1.2 散点图

1.3 条形图

1.4 直方图

2. 代码实现

2.1 绘制折线图

2.1.1 绘制简单折线图

2.1.2 折线图添加属性

2.2 绘制散点图

2.3 绘制条形图

2.3.1 绘制单个条形图 

2.3.2 绘制多个条形图

2.4 绘制直方图


    

本篇文章主要讲述pyplot绘图,主要涉及折线图、散点图、条形图、直方图。

1. 图像分类

1.1 折线图

        折线图以折线的上升和下降来表示统计数量的增减变化的统计图。

        特点:能够展示数据的变化趋势,反映事物的变化情况(变化)。

1.2 散点图

        用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。

        特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)。

1.3 条形图

        排列在工作表的列和行中的数据可以绘制到条形图中。

        特点:绘制离散的数据,能过看出各数据的大小,比较数据之间的差别(统计)。

1.4 直方图

        由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据范围,纵轴表示分布情况。

        特点:绘制连续的数据,展示一组或多组数据的分布状况(统计)。

2. 代码实现

2.1 绘制折线图

2.1.1 绘制简单折线图

        例1:根据给定数据画出一天的气温变化折线图。使用的绘图函数为:plot(x,y)  ,显示函数:show(x,y)。

from matplotlib import pyplot as plt

x = range(2, 26, 2) # 时间
y = [15, 13, 14.5, 17, 20, 25, 26, 26, 24, 22, 18, 15] # 温度

# 绘图
plt.plot(x, y)  

# 保存图像
# plt.savefig("./test.png")

# 显示图像
plt.show()

得到的图像如下所示:

图1 

 可以看出图像基本绘制出来,只是比较简单。例如x,y轴刻度稀疏,图像没有标题等。

2.1.2 折线图添加属性

        图1 比较简单,现在在此基础上添加一些属性。

import matplotlib
from matplotlib import pyplot as plt

# windows和linux设置字体方式
font = {'family': 'MicroSoft YaHei',
        'weight': 'bold',
        'size': '10.5'}
matplotlib.rc('font', **font)

x = range(2, 26, 2)  # 时间
y = [15, 13, 14.5, 17, 20, 25, 26, 26, 24, 22, 18, 15]  # 温度

# 设置图像大小
plt.figure(figsize=(20, 8), dpi=80)

# 绘图
plt.plot(x, y, marker="o", mec='r', mfc='w')  # 标记为o,边缘为红色,背景是白色

# 重新设定坐标轴刻度
_x = [i // 2 for i in range(49)]
_xticks = ["{}时".format(i) for i in _x]
plt.xticks(_x[::2], _xticks[::2])
plt.yticks(range(min(y), max(y) + 1))

# 书写标题
plt.title("一天的气温变化折线图")
plt.xlabel("时间/时")
plt.ylabel("温度/摄氏度")

# 保存图像
plt.savefig("./test.png")

# 网格
plt.grid(linestyle="-.", alpha=0.3)  # 透明度

# 显示图像
plt.show()

 得到的图像如下所示:

2.2 绘制散点图

        例2:假设通过爬虫你获取到了北京2016年3,10月份每天白天的最高气温(分别位于列表a,b),那么此时如何寻找出气温和随时间(天)变化的某种规律? 使用的绘图函数为:scatter(x,y)  

import matplotlib
from matplotlib import pyplot as plt

# 设置字体
font = {'family': 'MicroSoft YaHei',
        'weight': 'bold',
        'size': '10.5'}
matplotlib.rc('font', **font)
# 设置图像大小
plt.figure(figsize=(20, 8), dpi=80)

y_3 = [11, 17, 16, 11, 12, 11, 12, 6, 6, 7, 8, 9, 12, 15, 14, 17, 18, 21, 16, 17, 20, 14, 15, 15, 15, 19, 21, 22, 22,
       22, 23]
y_10 = [26, 26, 28, 19, 21, 17, 16, 19, 18, 20, 20, 19, 22, 23, 17, 20, 21, 20, 22, 15, 11, 15, 5, 13, 17, 10, 11, 13,
        12, 13, 6]
x_3 = range(1, 32)
x_10 = range(51, 82)

# 绘制散点图
plt.scatter(x_3, y_3, label="3月份")
plt.scatter(x_10, y_10, label="10月份")

# 绘制刻度(刻度只能绘制一次,不能实现叠加)
_x = list(x_3) + list(x_10)
_xticks_label = ["3月{0}".format(i) for i in x_3]
_xticks_label += ["10月{0}".format(i - 50) for i in x_10]
plt.xticks(_x[::3], _xticks_label[::3], rotation=45)

plt.grid(linestyle="-.", alpha=0.3)
# 图例
plt.legend()
plt.title("北京2016年3,10月份白天最高气温")
plt.xlabel("日期(单位:天)")
plt.ylabel("温度(单位:摄氏度)")

# 保存图像
plt.savefig("./test.png")
plt.show()

得到的图像如下所示:

2.3 绘制条形图

2.3.1 绘制单个条形图 

        例3:假设你获取到了2017年内地电影票房前20的电影(列表a)和电影票房数据(列表b),那么如何更加直观的展示该数据?

a = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5:最后的骑士","摔跤吧!爸爸","加勒比海盗5:死无对证", "金刚:骷髅岛","极限特工:终极回归","生化危机6:终章","乘风破浪","神偷奶爸3","智取威虎山","大闹天竺","金刚狼3:殊死一战", "蜘蛛侠:英雄归来","悟空传","银河护卫队2","情圣","新木乃伊"]

b=56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23] 单位:亿

from matplotlib import pyplot as plt
import matplotlib

font = {'family': 'MicroSoft YaHei',
        'weight': 'bold',
        'size': '10.5'}
matplotlib.rc('font', **font)
plt.figure(figsize=(20, 8), dpi=80)

a = ["战狼2", "速度与激情8", "功夫瑜伽", "西游伏妖篇", "变形金刚5:最后的骑士", "摔跤吧!爸爸", "加勒比海盗5:死无对证",
     "金刚:骷髅岛", "极限特工:终极回归", "生化危机6:终章", "乘风破浪", "神偷奶爸3", "智取威虎山", "大闹天竺", "金刚狼3:殊死一战",
     "蜘蛛侠:英雄归来", "悟空传", "银河护卫队2", "情圣", "新木乃伊"]

b = [56.01, 26.94, 17.53, 16.49, 15.45, 12.96, 11.8, 11.61, 11.28, 11.12, 10.49, 10.3, 8.75, 7.55, 7.32, 6.99, 6.88,
     6.86, 6.58, 6.23]

plt.barh(range(len(a)), b, height=0.3, color="orange")
plt.yticks(range(len(a)), a, rotation=30)
plt.title("2017年内地电影票房前20的电影")
plt.ylabel("片名")
plt.xlabel("票房/亿")
plt.grid(alpha=0.3)
plt.show()

得到的图像如下所示:

2.3.2 绘制多个条形图

        例4:假设你知道了列表a中电影分别在2017-09-14(b_14), 2017-09-15(b_15), 2017-09-16(b_16)三天的票房,为了展示列表中电影本身的票房以及同其他电影的数据对比情况,应该如何更加直观的呈现该数据?

a = ["猩球崛起3:终极之战","敦刻尔克","蜘蛛侠:英雄归来","战狼2"]

b_16 = [15746,312,4497,319]

b_15 = [12357,156,2045,168]

b_14 = [2358,399,2358,362]

from matplotlib import pyplot as plt
import matplotlib

font = {'family': 'MicroSoft YaHei',
        'weight': 'bold',
        'size': '10.5'}
matplotlib.rc('font', **font)
plt.figure(figsize=(20, 8), dpi=80)

a = ["猩球崛起3:终极之战", "敦刻尔克", "蜘蛛侠:英雄归来", "战狼2"]
b_16 = [15746, 312, 4497, 319]
b_15 = [12357, 156, 2045, 168]
b_14 = [2358, 399, 2358, 362]

x_14 = [x for x in range(len(a))]
x_15 = [x + 0.2 for x in x_14]
x_16 = [x + 0.2 * 2 for x in x_14]

plt.bar(x_14, b_14, width=0.2, label="9月14")
plt.bar(x_15, b_15, width=0.2, label="9月15")
plt.bar(x_16, b_16, width=0.2, label="9月16")

plt.xticks(x_15, a)
plt.xlabel("电影")
plt.ylabel("票房(单位:万元)")
plt.grid(alpha=0.2)
plt.legend()
# 保存图像
plt.savefig("./test.png")
plt.show()

 得到的图像如下所示:

2.4 绘制直方图

        例5:假设你获取了250部电影的时长(列表a中),希望统计出这些电影时长的分布状态(比如时长为100分钟到120分钟电影的数量,出现的频率)等信息, 你应该如何呈现这些数据?

a=[131, 98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124, 101, 110, 116, 117, 110, 128, 128, 115, 99, 136, 126, 134, 95, 138, 117, 111,78, 132, 124, 113, 150, 110, 117, 86, 95, 144, 105, 126, 130,126, 130, 126, 116, 123, 106, 112, 138, 123, 86, 101, 99, 136,123, 117, 119, 105, 137, 123, 128, 125, 104, 109, 134, 125, 127,105, 120, 107, 129, 116, 108, 132, 103, 136, 118, 102, 120, 114,105, 115, 132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134,156, 106, 117, 127, 144, 139, 139, 119, 140, 83, 110, 102,123,107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133,112, 114, 122, 109, 106, 123, 116, 131, 127, 115, 118, 112, 135, 115, 146, 137, 116, 103, 144, 83, 123, 111, 110, 111, 100, 154,136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 111, 109, 141,120, 117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 125, 126,114, 140, 103, 130, 141, 117, 106, 114, 121, 114, 133, 137, 92,121, 112, 146, 97, 137, 105, 98, 117, 112, 81, 97, 139, 113,134, 106, 144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 110,105, 129, 137, 112, 120, 113, 133, 112, 83, 94, 146, 133, 101,131, 116, 111, 84, 137, 115, 122, 106, 144, 109, 123, 116, 111,111, 133, 150]

from matplotlib import pyplot as plt
import matplotlib

font = {'family': 'MicroSoft YaHei',
        'weight': 'bold',
        'size': '10.5'}
matplotlib.rc('font', **font)
plt.figure(figsize=(20, 8), dpi=80)

a = [131, 98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124,
     101, 110, 116, 117, 110, 128, 128, 115, 99, 136, 126, 134, 95, 138, 117, 111, 78, 132, 124, 113, 150, 110, 117, 86,
     95, 144, 105, 126, 130, 126, 130, 126, 116, 123, 106, 112, 138, 123, 86, 101, 99, 136, 123, 117, 119, 105, 137,
     123, 128, 125, 104, 109, 134, 125, 127, 105, 120, 107, 129, 116, 108, 132, 103, 136, 118, 102, 120, 114, 105, 115,
     132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134, 156, 106, 117, 127, 144, 139, 139, 119, 140, 83, 110, 102,
     123, 107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133, 112, 114, 122, 109, 106, 123, 116, 131, 127,
     115, 118, 112, 135, 115, 146, 137, 116, 103, 144, 83, 123, 111, 110, 111, 100, 154, 136, 100, 118, 119, 133, 134,
     106, 129, 126, 110, 111, 109, 141, 120, 117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 125, 126, 114, 140, 103,
     130, 141, 117, 106, 114, 121, 114, 133, 137, 92, 121, 112, 146, 97, 137, 105, 98, 117, 112, 81, 97, 139, 113, 134,
     106, 144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 110, 105, 129, 137, 112, 120, 113, 133, 112, 83, 94, 146,
     133, 101, 131, 116, 111, 84, 137, 115, 122, 106, 144, 109, 123, 116, 111, 111, 133, 150]

# 画直方图
bin_width = 3  # 设置直方图宽
num_bins = int((max(a) - min(a)) / bin_width)  # 直方图数目
plt.hist(a, num_bins)
plt.xticks(list(range(min(a), max(a)))[::3], rotation=45)
plt.xlabel("电影时长(单位:分钟)")
plt.ylabel("数量")
plt.grid(linestyle="-.", alpha=0.2)
plt.show()

 得到的图像如下所示:

 总结:至此,4中常见图像的绘制展示完毕。以上例题来自学习资料,不对之处可以指出。

### 两种导入方式的区别 在 Python 中,`from matplotlib import pyplot` 和 `import matplotlib.pyplot` 是两种常见的导入方式,它们的主要区别在于命名空间的处理以及代码书写风格。 #### 导入方式一:`from matplotlib import pyplot` 这种方式通过 `from ... import ...` 的语法将 `pyplot` 模块直接引入到当前命名空间中。这意味着可以直接调用 `pyplot` 提供的功能而无需前缀模块名[^1]。 ```python from matplotlib import pyplot x = [1, 2, 3] y = [4, 5, 6] pyplot.plot(x, y) pyplot.show() ``` 此方法的优点是减少了每次调用函数时所需的字符数,使代码看起来更加简洁。然而,缺点是可能会与其他同名对象发生冲突,尤其是在复杂的项目中存在多个具有相同名称的对象时[^2]。 #### 导入方式二:`import matplotlib.pyplot` 这种形式保留了完整的模块路径结构,在使用该模块中的功能时需要显式指定其所属的模块名。这是更推荐的一种做法,因为它清晰地标明了函数或类的具体来源,有助于提高代码可读性和维护性[^3]。 ```python import matplotlib.pyplot as plt x = [1, 2, 3] y = [4, 5, 6] plt.plot(x, y) plt.show() ``` 通常情况下,为了简化书写并遵循社区惯例,人们会加上一个 alias (`as`) 来缩短原模块的名字长度,比如上面例子中的 `as plt` 就是一个非常普遍的做法[^4]。 综上所述,虽然两者都能实现同样的目的——访问 Matplotlib 库下的 PyPlot 子库所提供的绘图能力;但在实际开发过程中建议优先考虑后者即带全限定名的形式来增强程序逻辑表达上的透明度与一致性[^5]。 ### 总结表格对比 | 特性 | `from matplotlib import pyplot` | `import matplotlib.pyplot` | |-------------------|-----------------------------------------------|---------------------------------------| | 命名空间 | 直接进入全局命名空间 | 需要通过模块名访问 | | 可读性 | 较低 | 更高 | | 维护成本 | 较高 (可能引起名字污染) | 较低 | ```python # 推荐实践示例 import matplotlib.pyplot as plt x = [1, 2, 3] y = [4, 5, 6] plt.plot(x, y) plt.show() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值