Python数据可视化:Matplotlib面向对象绘图与六大图表实战

Matplotlib核心架构

(示意图:Matplotlib容器层与图像层关系)

一、Matplotlib面向对象绘图核心

1.1 架构分层解析

Matplotlib采用三层对象结构实现精细化绘图控制:

- 容器层:Figure(画布)为顶级容器,Axes(子图)承载具体图表元素

- 辅助层:坐标轴、图例、文本等辅助信息对象

- 图像层:Line2D(线条)、Patch(几何图形)等数据图形对象

1.2 多子图布局技巧

使用`plt.subplots()`批量创建网格化布局:

python

fig, axs = plt.subplots(2, 2, figsize=(12,8))  # 2x2子图网格

axs[0,0].plot(x, np.sin(x))                  # 左上子图

axs[1,1].scatter(x, x**2)                    # 右下子图

plt.tight_layout()                            # 智能调整间距

二、数学函数可视化实战

2.1 基础函数绘制

通过`np.linspace`生成连续数据绘制函数曲线:

python

x = np.linspace(-np.pi, np.pi, 400)

ax.plot(x, np.sin(x), color='#FF6B6B', label='sin(x)')

ax.plot(x, np.cos(x), 'g--', label='cos(x)')  # 虚线样式

2.2 复合函数叠加

在同一坐标系绘制多项式与三角函数对比:

python

ax.plot(x, 0.5*x**3 - 2*x + 1, label='三次多项式')

ax.plot(x, np.tan(x)/10, 'm:', label='tan(x)/10')

ax.set_ylim(-3,3)  # 限制Y轴范围

三、六大基础图表类型详解

3.1 折线图(Line Plot)

适用场景:趋势分析、时间序列 

代码示例:

import matplotlib.pyplot as plt

import random

#准备x,y数据

x=range(40)

y_shanghai=[random.uniform(15,18)for i in x]

y_beijing=[random.uniform(7,14)for j in x]

#创建画布

plt.figure(figsize=(20,8),dpi=100)

#绘制图像

plt.plot(x,y_shanghai,color='blue',linestyle='-')

plt.plot(x,y_beijing,color='red',linestyle='--')

#修改x,y刻度

#准备x,y刻度说明

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签

plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

x_label=["11点{}分".format(i)for i in x]

plt.xticks(x[ : : 5],x_label[::5])

plt.yticks(range(0,40,5))

#添加网格显示

plt.grid(linestyle='--',alpha=0.5)

#添加描述信息

plt.xlabel("时间变化")

plt.ylabel("温度变化")

plt.title("北京、上海11点到12点每分钟的温度变化状况")

#显示图例

plt.show()

3.2 直方图(Histogram)

适用场景:数据分布统计 

python

import matplotlib.pyplot as plt

import random

#需求:电影时常分布状况

#1.准备数据

x=range(20)

x_time=[random.uniform(0,100)for i in x]

#2.创建画布

plt.figure(figsize=(20,8),dpi=100)

#3.绘制图像

group_num=int((max(x_time)-min(x_time))/2)

plt.hist(x_time,bins=group_num,facecolor='red',alpha=0.5)

#修改x轴刻度

#添加网格

plt.grid(linestyle='--',alpha=0.5)

#4.显示图像

plt.show()

3.3 柱状图(Bar Chart)

适用场景:分类数据对比 

python

import matplotlib.pyplot as plt

#1.数据准备

movie_name=["雷神:诸神黄昏","正义联盟","东方快车谋杀案","寻梦环游记","全球风暴"]

first_day=["32453","68344","7344","28453","6234"]

first_week=["80989","76546","42355","87656","24556"]

#2.准备画布

plt.figure(figsize=(20,8),dpi=100)

#3.绘制图像

plt.bar(range(5),first_day,width=0.2,color=['b','r','g','y','c'],label="首日票房")

plt.bar([0.2,1.2,2.2,3.2,4.2],first_week,width=0.2,color=['b','r','g','y','c'],label="首周票房")

#修改刻度

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签

plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

plt.xticks([0.2,1.2,2.2,3.2,4.2],movie_name)

#4.显示图像

plt.show()

3.4 散点图(Scatter Plot)

适用场景:相关性分析、聚类 

python

import matplotlib.pyplot as plt

#数据准备

x=[324.42,243.55,234.43,567.34,453.31,123.11,353.76,267.65,367.56,243.62,324.75,243.12]

y=[234.23,234.45,254.32,343.56,342.67,234.56,321.65,245.23,267.45,239.23,278.34,278.56]

#创建画布

plt.figure(figsize=(20,8),dpi=100)

#绘制图像

plt.scatter(x,y)

#显示图像

plt.show()

3.5 饼图(Pie chart)

适用场景:占比分析 

python

movie_name=["雷神:诸神黄昏","正义联盟","东方快车谋杀案","寻梦环游记","全球风暴"]

place_count=[68790,45678,99873,54353,56724]

#2.创建画布

plt.figure(figsize=(20,8),dpi=100)

#3.绘制图像

plt.pie(place_count,labels=movie_name)

plt.axis('equal')

#创建网格

plt.grid(linestyle='--',alpha=0.5)

#显示图例

plt.legend()

#显示标题

plt.title("电影播放量")

#4.显示图像

plt.show()

注:数据均为假设

通过plt.lenged()添加图例

通过plt.grid()绘制网格

3.6 数学函数图像

import numpy as np

x = np.linspace(-1,1,100)

y = 2*x*x

#创建画布

plt.figure(figsize=(20,8),dpi=100)

#绘制图像

plt.plot(x,y)

#添加网格显示

plt.grid(linestyle='--',alpha=0.5)

#显示图像

plt.show()

四、样式优化与实用技巧

4.1 全局参数配置

python

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签

plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

4.2 动态可视化

在Jupyter中启用交互模式:

python

%matplotlib widget

from matplotlib.animation import FuncAnimation

def animate(i):

    line.set_ydata(np.sin(x + i/10))

    return line,

ani = FuncAnimation(fig, animate, frames=100, interval=50)

五、常见问题解决方案

1. 中文乱码:通过`font_manager`加载本地字体

2. 图像重叠:`plt.tight_layout()`自动调整布局

3. 坐标轴溢出:`ax.set_xlim()`手动设置边界

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容