Matplotlib学习

Matplotlib是一个用于绘制数据可视化图表的Python库。它可以用来创建各种类型的图表,例如线图、散点图、柱状图、直方图、饼图等。Matplotlib具有广泛的功能,可以满足各种绘图需求,并且可以与其他Python库(例如NumPy和Pandas)结合使用。它是数据科学和机器学习领域中最受欢迎的可视化工具之一。
示例:

import matplotlib.pyplot as plt
import random


# 1. 创建画布
plt.figure(figsize=(20, 8), dpi=100)  # figsize=(长, 宽)

# 2. 绘制图像
x = [i for i in range(1, 10)]
y = [i for i in range(11, 20)]
random.shuffle(y)
plt.plot(x, y)

# 3. 图像显示
plt.show()

image

2.1 示例

为了更好地理解所有基础绘图功能,我们通过天气温度变化的绘图来融合所有的基础API使用需求:画出某城市11点到12点1小时内每分钟的温度变化折线图,温度范围在15度~18度。

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


# 0. 准备数据
x = range(60)
y = [random.uniform(15, 18) for i in x]

# 1. 创建画布
plt.figure(figsize=(20, 8), dpi=100)

# 2. 绘制图像
plt.plot(x, y)

## 2.1 自定义x,y轴刻度
x_tickes_label = [f"11点{i}分" for i in x]
y_tickes_label = range(40)

## 2.2 指定xy轴的空隙
plt.xticks(x[::5], x_tickes_label[::5], fontsize=12)  #  xticks(ticks=None, labels=None, **kwargs)
plt.yticks(y_tickes_label[::5], fontsize=12)

# 2.3 添加网格显示
plt.grid(visible=True, linestyle="--", alpha=0.5)  # alpha为透明度

# 2.4 添加描述信息
plt.xlabel("时间", fontsize=14)
plt.ylabel("温度", fontsize=14)
plt.title("中午11点~12点某城市温度变化图", fontsize=20)

# 2.5 保存图片(保存图片一定要在plt.show()之前,否则会保存一张空的图片)
plt.savefig("./test.png")

# 3. 图像显示
plt.show()

2.2 常见的注意事项

2.2.1 坐标轴

xticks(ticks=None, labels=None, **kwargs)

  • ticks:x轴刻度位置的列表,若传入空列表,即不显示x轴
  • labels:放在指定刻度位置的标签文本。当ticks参数有输入值,该参数才能传入参数

2.2.2 显示中文字体

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

2.2.3 图片保存

保存图片一定要在plt.show()之前,否则会保存一张空的图片。

2.3 在一个坐标系中绘制多个图像

需求:再添加一个城市的温度变化。

收集到北京当天温度变化情况,温度在1度到3度。效果如下:
image

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


# 0. 准备数据
x = range(60)
y = [random.uniform(15, 18) for i in x]
y_BJ = [random.uniform(1, 3) for i in x]

# 1. 创建画布
plt.figure(figsize=(20, 8), dpi=100)

# 2. 绘制图像
plt.plot(x, y, label="上海温度")
plt.plot(x, y_BJ, color="red", linestyle="--", label="北京温度")

## 2.1 自定义x,y轴刻度
x_tickes_label = [f"11点{i}分" for i in x]
y_tickes_label = range(40)

## 2.2 指定xy轴的空隙
plt.xticks(x[::5], x_tickes_label[::5], fontsize=12)  #  xticks(ticks=None, labels=None, **kwargs)
plt.yticks(y_tickes_label[::5], fontsize=12)

# 2.3 添加网格显示
plt.grid(visible=True, linestyle="--", alpha=0.5)  # alpha为透明度

# 2.4 添加描述信息
plt.xlabel("时间", fontsize=14)
plt.ylabel("温度", fontsize=14)
plt.title("中午11点~12点某城市温度变化图", fontsize=20)

# 2.5 保存图片(保存图片一定要在plt.show()之前,否则会保存一张空的图片)
plt.savefig("./test.png")

# 2.6 显示图例
plt.legend(loc="best", fontsize=18)

# 3. 图像显示
plt.show()

2.4 多个坐标系显示 —— plt.subplots(面向对象的画图方法)

如果我们想要将上海和北京的天气图显示在同一个图的不同坐标系当中。效果如下:
image
可以通过subplots函数实现(旧的版本中有subplot,使用起来不方便),推荐subplots函数。

matplotlib.pyplot.subplots(nrows=1, ncols=1, **fig_kw)创建一个带有多个axes(坐标系/绘图区)的图。

Parameters:

nrows, ncols: 设置几行几列坐标系
  int, optional, default: 1, Number of rows/columns of the subplot grid.

Return:
  fig: 图对象
  axes: 返回相应数量的坐标系

设置标题等方法不同:
  set_xticks
  set_yticks
  set_xlabel
  set_ylabel

关于axes子坐标系的更多方法:参考https://matplotlib.org/stable/api/axes_api.html
注意:plt.函数名()相当于面向过程的画图方法,axes.set_方法名()相当于面向对象的画图方法。

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


# 0. 准备数据
x = range(60)
y = [random.uniform(15, 18) for _ in x]
y_BJ = [random.uniform(1, 3) for _ in x]


# 1. 创建画布
# plt.figure(figsize=(20, 8), dpi=100)
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 8), dpi=100)


# 2. 绘制图像
# plt.plot(x, y, label="上海温度")
# plt.plot(x, y_BJ, color="red", linestyle="--", label="北京温度")
axes[0].plot(x, y, label="上海温度")
axes[1].plot(x, y_BJ, color="red", linestyle="--", label="北京温度")

## 2.1 自定义x,y轴刻度
x_tickes_label = [f"11点{i}分" for i in x]
y_tickes_label = range(40)

## 2.2 指定xy轴的空隙
# plt.xticks(x[::5], x_tickes_label[::5], fontsize=12)  #  xticks(ticks=None, labels=None, **kwargs)
# plt.yticks(y_tickes_label[::5], fontsize=12)
axes[0].set_xticks(x[::5])
axes[0].set_yticks(y_tickes_label[::5])
axes[0].set_xticklabels(x_tickes_label[::5])

axes[1].set_xticks(x[::5])
axes[1].set_yticks(y_tickes_label[::5])
axes[1].set_xticklabels(x_tickes_label[::5])

# 2.3 添加网格显示
# plt.grid(visible=True, linestyle="--", alpha=0.5)  # alpha为透明度
axes[0].grid(visible=True, linestyle="--", alpha=0.5)
axes[1].grid(visible=True, linestyle="--", alpha=0.5)

# # 2.4 添加描述信息
# plt.xlabel("时间", fontsize=14)
# plt.ylabel("温度", fontsize=14)
# plt.title("中午11点~12点某城市温度变化图", fontsize=20)
axes[0].set_xlabel("时间", fontsize=14)
axes[0].set_ylabel("温度", fontsize=14)
axes[0].set_title("中午11点~12点上海市温度变化图", fontsize=20)

axes[1].set_xlabel("时间", fontsize=14)
axes[1].set_ylabel("温度", fontsize=14)
axes[1].set_title("中午11点~12点北京市温度变化图", fontsize=20)

# 2.5 保存图片(保存图片一定要在plt.show()之前,否则会保存一张空的图片)
plt.savefig("./test.png")

# 2.6 显示图例
# plt.legend(loc="best", fontsize=18)
axes[0].legend(loc="best", fontsize=18)
axes[1].legend(loc="best", fontsize=18)


# 3. 图像显示
plt.show()

2.5 折线图的应用场景

举例:

  • 呈现公司产品(不同区域)每天活跃用户数
  • 呈现app每天下载数量
  • 呈现产品新功能上线后,用户点击次数随时间的变化
    拓展:画各种数学函数图像
    注意:plt.plot()除了可以画折线图,也可以用于画各种数学函数图像。
    image

小结

  • 添加x,y轴列度【知道】
    plt.xticks()
    plt.yticks()
    注意:在传递进去的第一个参数必须是数字,不能是字符串。如果是字符串,需要进行替换操作
  • 添加网格显示【知道】
    plt.grid(linestyle="--"", alpha=0.5)
    添加描述信息【知道】
    plt.xlabel()
    plt.ylabel()
    plt.title()
  • 图像保存【知道】
    plt.savefig("路径")
    多次plot【了解】
    直接进行添加就OK
  • 显示图例【知道】
    plt.legend(loc="best")
    注意:一定要在plt.plot()里面设置一个label。如果不设置,没法显示
  • 多个坐标系显示【了解】
    plt.subplots(nrows=, ncols=)
  • 折线图的应用【知道】
    应用于观察数据的变化
    画出一些数学函数图像

2.6 常见图形绘制

学习目标:掌握常见统计图及其意义。

Matplotlib能够绘制折线图、散点图、柱状图、直方图、饼图。我们需要知道不同的统计图的意义,以此来决定选择哪种统计图来呈现我们的数据。
image

  1. 折线图:以折线的上升或下降来表示统计数量的增减变化的统计图。
    特点:能够显示数据的变化趋势,反映事物的变化情况。——变化
    api:plt.plot(x, y)

  2. 散点图:用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。
    特点:判断变量之间是否存在数量关系趋势,展示离群点。——分布规律
    api:plt.scatter(x, y)

  3. 柱状图:排列在工作表的列或行中的数据可以绘制到柱状图中。
    特点:绘制离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。——统计/对比
    api:plt.bar(x, width, align="center", **kwargs)
    参数说明:
    x:需要传递的数据
    width:柱状图的宽度
    align:每个柱状图的位置对齐方式:{"center", "edge"}, optional, default: "center"
    **kwargs
    color:选择柱状图的颜色

  4. 直方图:由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据范围,纵轴表示分布情况。
    特点:绘制连续性的数据,展示一组或多组数据的分布情况。——统计
    api:plt.hist(x, bins=None)
    参数说明:
    x:需要传递的数据
    bins:bins参数指定直方图的箱子数量,用于将数据分成若干个区间并计算每个区间内数据的频数。可以通过调整bins的值来控制直方图的分辨率和精度,从而更好地理解数据的分布情况。如果不指定bins参数,则默认将数据分为10个区间。

  5. 饼图:用于表示不同分类的占比情况,通过弧度大小来对比各种分类,
    特点:分类数据的占比情况。——占比
    api:plt.pie(x, labels=, autopct=, colors)
    参数说明:
    x:数量,自动算百分比
    labels:每个section的名称
    autopct:占比显示指定%1.2f%
    colors:每部分颜色

    直方图和柱状图的区别:

直方图和柱状图都是用于表示数据分布的图形,但它们的意义和使用场景不同。

直方图是一种连续型数据的图形表示方法,横轴表示数据的取值范围,纵轴表示数据出现的频率或概率密度。直方图的连续条形图之间没有间隔,因为它们代表的是连续的数据范围,因此在直方图中所有的条形都是相邻且相互重叠的,而且它们的宽度通常是不等的。直方图通常用于表示数据的分布情况,包括数据的集中程度、对称性、偏斜程度等。

柱状图则是一种离散型数据的图形表示方法,横轴表示不同的类别或数据,纵轴表示数量或比例。柱状图的条形之间有间隔,因为它们代表的是不同的类别或数据,它们的宽度通常是相等的。柱状图通常用于比较不同类别或数据之间的数量或比例。

因此,直方图和柱状图的区别在于数据类型和表示方式。直方图适用于连续型数据的分布表示,而柱状图适用于离散型数据的比较表示。

直方图的横坐标表示数据的取值范围,可以理解为数据的区间或者分组,每个区间内包含的数据范围是一样的。而直方图的纵坐标表示每个区间内数据出现的频数或频率,也可以表示为概率密度。因此,直方图的纵轴高度越高,表示这个区间内的数据出现的频率越高,反之亦然。通过直方图,我们可以直观地了解数据的分布情况和数据的集中程度。

posted @ 2023-05-11 09:31  嗨^_^  阅读(69)  评论(0)    收藏  举报