matplotlib与数据可视化

8 matplotlib数据可视化

本教程参考连接:https://www.tutorialspoint.com/matplotlib/matplotlib_quick_guide.htm

matplotlib简介:

Matplotlib 是一个强大的 Python 绘图库,它提供了一个类似于 MATLAB 的绘图框架,使得用户可以轻松地创建高质量的图表和可视化效果。它包含了大量的绘图工具和自定义选项,支持多种图表类型,如折线图、散点图、柱状图、饼图等,并且可以进行复杂的布局和样式调整。Matplotlib 广泛用于数据科学、工程、科研和其他领域,因其灵活性和丰富的功能而受到数据分析师和科学家的青睐。此外,Matplotlib 还支持将图表保存为多种格式,如 PNGPDFSVG 等,非常适合在报告和演示中使用。

8.1 基础图表类型

柱状图(Bar):适用于展示类别数据的数量或频率,用于对比不同类别之间的数值(如每月的销售额、各部门的员工数等)。

条形图(Barh):与柱状图类似,但为水平排列,适合当类目名称较长时使用,便于对比长条形的类别(如城市、公司等)数据。

箱型图(Boxplot):适合展示数据的分布情况,尤其适用于查看数据的中位数、四分位数、异常值等(如不同群体的测试分数、收入等)。

直方图(Hist):适用于展示连续数据的分布,通过分组观察数据在数值范围上的集中情况(如年龄分布、身高体重等)。

二维直方图(hist2d):适合显示两个变量的联合分布,用于探索两个变量之间的关系及其分布特征(如投影位置和颜色值分布)。

饼图(Pie):适合展示一个数据集中各个部分的比例关系(如市场份额、产品销售占比),但仅限于少量类别数据。

绘制直线或标记(Plot lines and/or markers to the Axes):适用于展示趋势或简单关系,可以标记和绘制单个或多个数据集的趋势(如时间序列数据、函数曲线等)。

极地图(Polar):适用于极坐标数据的展示,适合展现方向性数据或周期性数据(如风速和方向、周期性事件等)。

散点图(Scatter):适合展示两个变量之间的关系或分布情况,可用于探索是否存在关联(如年龄和收入、体重和身高等)。

堆积折线图(Stackplot):适合展示累积数据的变化,用于显示数据随时间的积累变化情况(如多个公司合并的市场份额变化、费用累计变化)。

离散序列图(Stem):适合展示离散点的数据,一般用于强调个别数据点的变化(如信号处理中的脉冲信号、采样点的展示)。

阶梯图(Step):适用于表示状态的变化或分段变化的数据(如电价随时间变化、库存状态等),特别是数据分段变化时使用。

向量图(Quiver):适合展示方向和幅值,用于展示带有方向和大小的矢量数据(如风速、海流、力的方向等)。

#解决kaggle中文显示乱码
import matplotlib.pyplot as plt
import matplotlib.font_manager as font_manager

# Path to the custom font
font_path = '/kaggle/input/chinese-font/NotoSansSC-VariableFont_wght.ttf'

# Add the custom font to the font manager
font_manager.fontManager.addfont(font_path)

# After adding the font, search for it by filename to get the correct font name
for font in font_manager.fontManager.ttflist:
    if font.fname == font_path:
        print(f"Found font: {font.name}")
        plt.rcParams['font.family'] = font.name
        break

import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
plt.rcParams['font.family'] = 'SimHei'  # 替换为你选择的字体
plt.rcParams["axes.unicode_minus"]=False #该语句解决图像中的“-”负号的乱码问题

# 创建演示使用的数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
categories = ['A', 'B', 'C', 'D']
sizes = [15, 30, 45, 10]
theta = np.linspace(0, 2 * np.pi, 100)

# 创建图表和子图
fig, axs = plt.subplots(5, 3, figsize=(15, 20))
fig.tight_layout(pad=4.0)

# 柱状图
axs[0, 0].bar(categories, sizes)
axs[0, 0].set_title("柱状图")

# 条形图
axs[0, 1].barh(categories, sizes)
axs[0, 1].set_title("条形图")

# 箱型图
axs[0, 2].boxplot([np.random.normal(size=100) for _ in range(4)], labels=categories)
axs[0, 2].set_title("箱型图")

# 直方图
axs[1, 0].hist(np.random.normal(size=100), bins=10)
axs[1, 0].set_title("直方图")

# 二维直方图
axs[1, 1].hist2d(np.random.randn(1000), np.random.randn(1000), bins=30)
axs[1, 1].set_title("二维直方图")

# 饼图
axs[1, 2].pie(sizes, labels=categories, autopct='%1.1f%%')
axs[1, 2].set_title("饼图")

# 绘制直线或标记
axs[2, 0].plot(x, y)
axs[2, 0].set_title("绘制直线或标记")

# 极地图
polar_ax = fig.add_subplot(5, 3, 8, projection='polar')
polar_ax.plot(theta, np.abs(np.sin(theta)))
polar_ax.set_title("极地图")

# 散点图
axs[2, 2].scatter(x, y)
axs[2, 2].set_title("散点图")

# 堆积折线图
axs[3, 0].stackplot(x, np.abs(y), np.abs(np.cos(x)))
axs[3, 0].set_title("堆积折线图")

# 离散序列图
axs[3, 1].stem(x, np.cos(x), linefmt='b-', markerfmt='bo', basefmt=" ")
axs[3, 1].set_title("离散序列图")

# 阶梯图
axs[3, 2].step(x, y, where='mid')
axs[3, 2].set_title("阶梯图")

# 向量图
Y, X = np.meshgrid(np.arange(-5, 6), np.arange(-5, 6))
U = -1 - X**2 + Y
V = 1 + X - Y**2
axs[4, 0].quiver(X, Y, U, V)
axs[4, 0].set_title("向量图")

axs[4, 1].remove()
axs[4, 2].remove()

plt.show()

基于函数的方法

8.2 绘制简单图表

为了掌握如何使用matplotlib来绘制图表,我们首先来绘制一个展示弧度与正弦值关系的线图。

首先,我们导入Matplotlib包中的Pyplot模块,并按照习惯将它简称为plt

import matplotlib.pyplot as plt

同样,我们导入NumPy,并将它简称为np

import numpy as np

notebook中的魔法语句,在笔记本中直接显示图片,而不是在新窗口中打开,这个语句在其他Python编程环境中无效

%matplotlib inline

我们使用NumPy库中的arange()函数,获取了一个介于0之间的角度数组对象,间隔为0.05

x = np.arange(0, np.pi*2, 0.05)
#x

y的值为x值的正弦值

y = np.sin(x)
#y

使用plot()函数绘制xy的值

plt.plot(x,y)

设置图表的标题,x轴和y轴的标签

plt.xlabel("angle")
plt.ylabel("sine")
plt.title('sine wave')

显示图表

plt.show()

完整的代码如下:

from matplotlib import pyplot as plt
import numpy as np

%matplotlib inline
x = np.arange(0, np.pi*2, 0.05)
y = np.sin(x)
plt.plot(x,y)
plt.xlabel("angle")
plt.ylabel("sine")
plt.title('sine wave')
plt.show()

8.3 绘制多个子图表

想要在一个画布上绘制多个子图表,我们可以使用subplot()函数。 subplot() 函数用于在单个画布上创建多个子图的函数,它允许你指定子图的行数(nrows)、列数(ncols)以及子图在网格中的位置(index),从而在画布上安排多个图表区域,每个区域可以独立绘制不同的数据。 例如我们想绘制21列,共2个子图表,可以传入参数=2”=1”,以及要绘制的子图表的索引“index=n”,子图表的索引为12,共2个子图表,代码如下:

import matplotlib.pyplot as plt
#参数211分别表示,2行,1列,索引1
#创建2行,1列,共2个子图,当前绘制第1个子图
plt.subplot(211)
plt.plot(range(12))
#参数212表示,当前绘制第2个子图
plt.subplot(212, facecolor='y') # 创建第2个子图,以黄色为背景色
plt.plot(range(12))
plt.show()

8.4 在图表中插入子图表

plt.axes()函数用于在当前图形中创建一个新的子图对象(Axes),允许用户在指定的位置添加子图,提供了灵活的布局控制和绘图功能。

import matplotlib.pyplot as plt
# 绘制折线,等效于使用subplot(111),创建1个只有1个子图的画布
plt.plot([1,2,3],[1,4,9])
# 使用axes()函数,在22列布局的画布的第1个位置绘制子图
plt.axes(221)
plt.plot(range(12))
plt.show()

面向对象的方法 推荐使用

8.5 matplotlib的面向对象接口

尽管使用matplotlib.pyplot模块可以轻松快速地生成图表,但推荐采用面向对象的方法,因为它能提供更多的控制和定制化选项。 采用更规范的面向对象方法的主要理念是创建图形对象,然后通过这些对象调用方法或访问属性。这种方法在处理包含多个图表的画布时更为有效。 首先,先创建画布对象。

#创建空白画布
fig = plt.figure()

使用add_axes()方法,向画布中添加一个子图表。 add_axes()方法需要一个包含4个元素的列表参数,分别对应于图形的左、下、宽和高。这些值是相对于图形窗口的比例,范围从01

#添加子图表,并命名为:ax
#[0, 0, 1, 1] 是一个列表,指定了子图表对象在图形窗口中的位置和大小
#即从左边,底部开始,覆盖整个窗口(宽带和高度为1,即100%
ax = fig.add_axes([0,0,1,1])

设置x轴标签,y轴标签,和图表标题

#设置图表标题
ax.set_title("sine wave")
#设置x轴标签
ax.set_xlabel('angle')
#设置y轴标签
ax.set_ylabel('sine')

调用子图表对象(axes object)的plot()方法,绘制图形

ax.plot(x,y)

完整代码如下:

from matplotlib import pyplot as plt
import numpy as np

%matplotlib inline
x = np.arange(0, np.pi*2, 0.05)
y = np.sin(x)
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
ax.plot(x,y)
ax.set_title("sine wave")
ax.set_xlabel('angle')
ax.set_ylabel('sine')
plt.show()

8.6 图表对象(Figure Class

matplotlib.figure 模块包含了 Figure 类。它是所有图表元素的顶级容器。通过从 pyplot 模块调用 figure() 函数来实例化 Figure 对象。

#通过调用plt.figure()方法,实例化Figure对象
fig = plt.figure()

图表对象(Figure Class)的参数:

属性

名称

描述

Figsize

图表尺寸

以元组作为参数,单位为英寸

Dpi

分辨率

每英寸多少像素点

Facecolor

背景颜色

设置窗口背景颜色

Edgecolor

轮廓颜色

控制图形元素轮廓的颜色

Linewidth

线宽

设置线条宽度

8.7 子图表对象(Axes Class

子图对象(Axes Class)是图像中具有数据空间的区域。一个给定的图形(Figure Class)可以包含多个子图对象。子图对象包含两个(或者在三维情况下是三个)轴对象(Axis objects)。子图类(Axes Class)及其成员函数是使用面向对象接口工作的主要入口。 子图对象是通过调用 add_axes() 方法添加到图形中的。它返回子图对象,并在位置 rect [左,下,宽,高] 处添加一个子图,其中所有量都是相对于图形宽度和高度的比例。

使用fig.add_axes()方法将子图对象添加到图表中:

ax = fig.add_axes([0,0,1,1])

8.7.1 图例(legend()

使用legend()方法将图例绘制到图表中

ax.legend(handles, labels, loc)

图例的位置

图例的位置字符串

图例的位置代码

Best

0

upper right

1

upper left

2

lower left

3

lower right

4

Right

5

Center left

6

Center right

7

lower center

8

upper center

9

Center

10

8.7.2 子图对象的axes.plot()方法

子图对象的基本方法,用于将一个数组的值与另一个数组的值作为线或标记进行绘制。plot() 方法可以有一个可选的格式字符串参数,用于指定线和标记的颜色、样式和大小。

绘制颜色(Color):

字符表示

颜色

‘b’

Blue

‘g’

Green

‘r’

Red

‘b’

Blue

‘c’

Cyan

‘m’

Magenta

‘y’

Yellow

‘k’

Black

‘b’

Blue

‘w’

White

绘制点的形状(Marker codes):

字符表示

描述

‘.’

‘o’

圆形

‘x’

X

‘D’

钻石型

‘H’

六边形

‘s’

正方形

‘+’

加号型

线段类型(Line styles):

Character

Description

’-‘

实线

‘–’

虚线

‘-.’

点划线

‘:’

点线

#可以根据需求,查表替换自己想要绘制的颜色(Color)、点的形状(Marker codes)、线段类型(Line styles
import matplotlib.pyplot as plt
x1 = [1, 16, 30, 42,55, 68, 77,88]
x2 = [1,6,12,18,28, 40, 52, 65]
y = [1, 4, 9, 16, 25,36,49, 64]
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
l1 = ax.plot(x1,y,'yH-') # 以黄色、方点、实线进行绘制
l2 = ax.plot(x2,y,'go--') # 以绿色、圆点、虚线进行绘制
ax.legend(labels = ('tv', 'Smartphone'), loc = 'lower right') # 图例的位置在右下方
ax.set_title("Advertisement effect on sales")
ax.set_xlabel('medium')
ax.set_ylabel('sales')
plt.show()

8.8 使用面向对象的方法绘制多个子图表

图形类(figure)的 add_subplot() 函数不会覆盖现有的图表:

import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.plot([1,2,3])
ax2 = fig.add_subplot(221, facecolor='y')
ax2.plot([1,2,3])

可以在图表画布中插入其他子图表:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0, np.pi*2, 0.05)
fig = plt.figure()
axes1 = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # 主图表
axes2 = fig.add_axes([0.55, 0.55, 0.3, 0.3]) # 插入子图表
y = np.sin(x)
axes1.plot(x, y, 'b')
axes2.plot(x,np.cos(x),'r')
axes1.set_title('sine')
axes2.set_title("cosine")
plt.show()

8.9 使用 subplots() 方法可以方便地绘制包含多个子图的图表

subplots()方法可以同时创建画布对象和子图对象(多个):

#创建画布对象和X个子图对象
plt.subplots(行数, 列数)

这个方法的两个整数参数指定了子图网格的行数和列数。该函数返回一个画布对象和一个包含子图对象的元组,等于 nrows*ncols。每个轴子图象都可以通过其索引访问。在这里,我们创建了一个22列的4个子图,并在图表中显示4个不同的子图。

import matplotlib.pyplot as plt
import numpy as np

#创建画布对象fig2*2列共4个子图元组a
#a元组包含4个子图(22列),可以使用索引访问
fig,a =  plt.subplots(2,2)
x = np.arange(1,5)
#a[0][0]为第1行第1列的子图(从0开始计数)
a[0][0].plot(x,x*x)
a[0][0].set_title('square')
#a[0][1]为第1行第2列的子图(从0开始计数)
a[0][1].plot(x,np.sqrt(x))
a[0][1].set_title('square root')
#a[1][0]为第2行第1列的子图(从0开始计数)
a[1][0].plot(x,np.exp(x))
a[1][0].set_title('exp')
#a[1][1]为第2行第2列的子图(从0开始计数)
a[1][1].plot(x,np.log10(x))
a[1][1].set_title('log')
plt.show()

图表中的元素:

8.10 网格

子图对象的 grid() 函数用于设置图形内部网格的可见性,可以开启或关闭。 您还可以显示网格的主要/次要(或两者)刻度。此外,还可以在 grid() 函数中设置颜色、线型和线宽属性。

import matplotlib.pyplot as plt
import numpy as np

fig, axes = plt.subplots(1,3, figsize = (12,4))
x = np.arange(1,11)
axes[0].plot(x, x**3, 'g',lw=2)
axes[0].grid(True)
axes[0].set_title('默认网格')
axes[1].plot(x, np.exp(x), 'r')
axes[1].grid(color='b', ls = '-.', lw = 0.25)
axes[1].set_title('定制网格')
axes[2].plot(x,x)
axes[2].set_title('无网格')
fig.tight_layout()
plt.show()

8.11 比例尺

有时,一个数据点比大部分数据要大得多。在这种情况下,需要将轴的比例尺设置为对数比例尺,而不是正常的比例尺。这就是对数比例尺。在 Matplotlib 中,可以通过将轴对象的 xscale yscale 属性设置为 ‘log’ 来实现。 有时还需要修改轴刻度和轴标签之间的距离。可以为任一轴(x轴或y轴或两者)设置 labelpad 属性为所需的值。 以下示例展示了上述两个功能。右侧的子图使用了对数比例尺,左侧的子图的x轴标签距离更远。

import matplotlib.pyplot as plt
import numpy as np


fig, axes = plt.subplots(1, 2, figsize=(10,4))
x = np.arange(1,5)
axes[0].plot( x, np.exp(x))
axes[0].plot(x,x**2)
axes[0].set_title("Normal scale")
axes[1].plot (x, np.exp(x))
axes[1].plot(x, x**2)
axes[1].set_yscale("log")
axes[1].set_title("Logarithmic scale (y)")
axes[0].set_xlabel("x axis")
axes[0].set_ylabel("y axis")
#设置x轴标签与轴刻度之间的距离,单位是点(point
axes[0].xaxis.labelpad = 10
axes[1].set_xlabel("x axis")
axes[1].set_ylabel("y axis")
plt.show()

8.12 限制x轴或y轴在图表中显示的最小值和最大值

Matplotlib 会自动确定要在图表的x轴、y轴上显示的变量的最小值和最大值。然而,可以通过使用 set_xlim() set_ylim() 函数显式地设置这些限制。

在下面的图表中,显示了x轴和y轴的自动缩放限制。

import matplotlib.pyplot as plt
import numpy as np


fig, a = plt.subplots(1, 2, figsize=(10,4))
x = np.arange(1,10)
a[0].plot(x, np.exp(x))
a[0].set_title('exp')

a[1].plot(x, np.exp(x),'r')
a[1].set_title('exp')
#限制y轴的范围(0,1000
a[1].set_ylim(0,1000)
#限制x轴的范围(0,10
a[1].set_xlim(0,10)
plt.show()

8.13 设置刻度和刻度标签

Matplotlib 自动处理了在轴上的刻度。Matplotlib 的默认刻度定位器和格式化器通常在许多常见情况下是足够的。不过,你可以根据特定需求明确指定刻度的位置和标签。

xticks() yticks() 函数接受一个列表对象作为参数,列表中的元素表示在相应轴上显示刻度的位置。

#将刻度设置为2,4,6,8,10
ax.set_xticks([2,4,6,8,10])

#将刻度标签设置为‘two’, ‘four’,’six’, ‘eight’, ‘ten’
ax.set_xlabels([‘two’, ‘four’,’six’, ‘eight’, ‘ten’])

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0, np.pi*2, 0.05)
fig = plt.figure()
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # main axes
y = np.sin(x)
ax.plot(x, y)
ax.set_xlabel('angle')
ax.set_title('sine')
ax.set_xticks([0,2,4,6])
ax.set_xticklabels(['zero','two','four','six'])
ax.set_yticks([-1,0,1])
plt.show()

8.14 双轴图表

有时我们需要在同一个图表中设置两个x轴或y轴,尤其是在需要绘制具有不同单位的曲线时。Matplotlib 提供了 twinx twiny 函数来实现这一功能。

以下示例展示了一个具有两个y轴的图表,其中一个y轴显示 exp(x),另一个显示 log(x)

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
a1 = fig.add_axes([0,0,1,1])
x = np.arange(1,11)
a1.plot(x,np.exp(x))
a1.set_ylabel('exp')
#共享相同的x轴,但拥有独立的y
a2 = a1.twinx()
a2.plot(x, np.log(x),'ro-')
a2.set_ylabel('log')
fig.legend(labels = ('exp','log'),loc='upper left')
plt.show()

8.15 常用图表绘制

8.15.1 柱状图

排列柱状图是一种有效的数据可视化方法,它通过将不同数据系列用不同颜色、大小和位置的条形组合起来,帮助观察者快速识别出数据之间的差异、趋势和关系。这种图表的设计灵活,可以根据数据的特点选择合适的柱形的厚度、颜色和排列方式,以便更好地展示数据的信息。

import numpy as np
import matplotlib.pyplot as plt

data = [[30, 25, 50, 20],
[40, 23, 51, 17],
[35, 22, 45, 19]]
X = np.arange(4)
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
ax.bar(X + 0.00, data[0], color = '#1f77b4', width = 0.25)
#x轴每次偏移的距离为柱状图的宽度
ax.bar(X + 0.25, data[1], color = '#ff7f0e', width = 0.25)
ax.bar(X + 0.50, data[2], color = '#2ca02c', width = 0.25)
ax.legend(labels = ('C语言','Python','JavaScript'),loc = 0)
plt.show()

8.15.2 折线图

折线图是一种常用的数据可视化方法,通过连接连续数据点来展示不同时间或维度上的数据趋势和变化。它能够清晰地显示数据的上下波动、增长和缩小等特征,使观察者能够快速了解数据之间的关系和规律。

import matplotlib.pyplot as plt

# 准备数据
epochs = range(1, 11# X轴数据:训练的epoch,从110
loss_values = [0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.25, 0.2, 0.15# Y轴数据:对应的loss

# 使用plot()函数绘制折线图
plt.plot(epochs, loss_values, marker='o', linestyle='-', color='b'# 蓝色的线条和圆圈标记

# 添加标题和标签
plt.title('Loss vs. Training Epochs'# 图表标题
plt.xlabel('Epochs'# X轴标签
plt.ylabel('Loss'# Y轴标签

# 添加图例
plt.legend(['Loss'])

# 显示网格(可选)
plt.grid(True)

# 显示图表
plt.show()

8.15.3 直方图

直方图是一种统计图表,用于展示数据分布的情况,它将数据分组到连续的、不重叠的区间(或箱子)内,并以条形的高度表示每个区间内数据出现的频率或数量。这种图表特别适合用来观察数据的分布形状、集中趋势和离散程度,如数据是否对称、是否呈现正态分布或者是否有异常值。直方图的X轴表示数据的区间,而Y轴表示每个区间的频数或百分比,条形的长度和高度直观地反映了数据在各个区间的分布情况。

import matplotlib.pyplot as plt
import numpy as np

# 假设我们有 1000 个连接输入层和隐藏层的权重
# 这里生成的权重符合正态分布 (均值=0, 标准差=0.1),也可以根据实际数据来替换
weights = np.random.normal(0, 0.1, 1000)

# 绘制权重值分布的直方图
plt.figure(figsize=(8, 6))
plt.hist(weights, bins=30, color='skyblue', edgecolor='black')
plt.title("Distribution of Weights between Input Layer and Hidden Layer")
plt.xlabel("Weight Values")
plt.ylabel("Frequency")
plt.grid(axis='y', linestyle='--', alpha=0.7)

# 显示图表
plt.show()

8.16 练习

练习1:绘制一周内每日平均温度变化的折线图 演示数据: 一周内每天的日期 days = [‘Monday’, ‘Tuesday’, ‘Wednesday’, ‘Thursday’, ‘Friday’, ‘Saturday’, ‘Sunday’] 每天的平均温度(摄氏度) temperatures = [22, 24, 19, 23, 25, 27, 26]

import matplotlib.pyplot as plt

# 准备数据
days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
temperatures = [22, 24, 19, 23, 25, 27, 26]

# 绘制折线图
plt.plot(days, temperatures, marker='o'# marker='o'表示用圆圈标记数据点

# 添加标题和标签
plt.title('Daily Temperature Variation'# 图表标题
plt.xlabel('Day of the Week'# X轴标签
plt.ylabel('Temperature (°C)'# Y轴标签

# 显示网格(可选)
plt.grid(True)

# 显示图表
plt.show()

练习2:绘制一组随机数据的直方图 演示数据: 使用random模块随机生成 product_lifetimes = [random.randint(1000, 5000) for _ in range(100)]

import matplotlib.pyplot as plt
import random

# 准备数据
product_lifetimes = [random.randint(1000, 5000) for _ in range(100)]

# 绘制直方图
plt.hist(product_lifetimes, bins=20, color='skyblue', edgecolor='black')

# 添加标题和标签
plt.title('Product Lifetimes Distribution'# 图表标题
plt.xlabel('Lifetime (hours)'# X轴标签
plt.ylabel('Frequency'# Y轴标签

# 显示图表
plt.show()

练习3:绘制广西电商市场概况,零售额及零售量的折线图 演示数据: Excel文件路径:/kaggle/input/overview-of-e-commerce-market-in-guangxi/Overview of Rural E-commerce Market in Guangxi202001-202307.xlsx

import matplotlib.pyplot as plt
import pandas as pd
from matplotlib.dates import DateFormatter


df = pd.read_excel('/kaggle/input/overview-of-e-commerce-market-in-guangxi/Overview of Rural E-commerce Market in Guangxi202001-202307.xlsx')
df.head(10)

# Excel 序列号转换为日期
df['时间'] = pd.to_datetime(df['时间'], origin='1899-12-30', unit='D')
df.set_index('时间', inplace=True)

# 创建主图表
fig, ax1 = plt.subplots(figsize=(10, 6))

# 绘制零售额的折线图
ax1.plot(df.index, df['零售额(万元)'], label='零售额(万元)', color='blue', marker='o')
ax1.set_xlabel('时间')
ax1.set_ylabel('零售额(万元)', color='blue')
ax1.tick_params(axis='y', labelcolor='blue')

# 创建共享 x 轴的第二个 Y
ax2 = ax1.twinx()
ax2.plot(df.index, df['零售量(万件)'], label='零售量(万件)', color='green', marker='s')
ax2.set_ylabel('零售量(万件)', color='green')
ax2.tick_params(axis='y', labelcolor='green')

# 格式化 x 轴的时间显示
date_form = DateFormatter("%Y-%m")
ax1.xaxis.set_major_formatter(date_form)

# 添加标题和网格
fig.suptitle('零售额和零售量随时间变化')
plt.grid(axis='y', linestyle='--', alpha=0.7)

# 显示图表
plt.show()

练习4:绘制不同城市,店铺销售额叠加柱状图,选取时间为20201 演示数据: Excel文件路径:/kaggle/input/overview-of-e-commerce-market-in-guangxi/Transaction Scale of Rural Online Retail Stores in Guangxi202001-202307.xlsx

import matplotlib.pyplot as plt
import pandas as pd

df = pd.read_excel('/kaggle/input/overview-of-e-commerce-market-in-guangxi/Transaction Scale of Rural Online Retail Stores in Guangxi202001-202307.xlsx')
df['时间'] = pd.to_datetime(df['时间'], origin='1899-12-30', unit='D')

#绘制20201月份的数据
df = df.loc[df['时间'] == '2020-01-01']
df.head(10)

# 设置城市为索引
df.set_index('城市', inplace=True)

# 提取各个销售额区间的店铺数量
sales_ranges = [
    '销售额0-2万店铺数量',
    '销售额2-5万店铺数量',
    '销售额5-10万店铺数量',
    '销售额10-100万店铺数量',
    '销售额100万以上店铺数量'
]

# 绘制叠加柱状图
df[sales_ranges].plot(kind='bar', stacked=True, figsize=(10, 6))

# 添加标题和轴标签
plt.title('不同城市的销售额分布')
plt.xlabel('城市')
plt.ylabel('店铺数量')

# 显示图例
plt.legend(title='销售额区间')
plt.show()

 

 

notebook链接:https://www.kaggle.com/code/jeanshendev/matplotlib

下载本节的示例代码及文件:matplotlib.ipynb