目录
-
前言:数据可视化的重要性
-
散点图:发现变量间的关系
-
折线图:展示趋势变化
-
柱形图:比较分类数据
-
饼图:呈现比例构成
-
箱线图:分析数据分布
-
综合对比与选用指南
-
常见问题解答
-
总结与资源
1. 前言:数据可视化的重要
数据可视化是数据分析中不可或缺的一环,它能够:
-
直观呈现复杂数据关系
-
快速识别数据模式和异常值
-
有效传达分析结果给非技术人员
Matplotlib作为Python最基础也是最强大的可视化库,提供了丰富的图表类型。本文将重点讲解五种最常用的图表类型,通过真实案例演示如何从数据到可视化呈现的全过程。
你将学到:
✅ 5种核心图表的适用场景
✅ 每种图表的定制化技巧
✅ 商业分析中的实际应用
✅ 常见问题的解决方案
所有代码均可直接复制使用,并附带示例数据集。
2. 散点图:发现变量间的关系
散点图(Scatter Plot) 是一种用于展示 两个连续变量之间关系 的数据可视化图表。它通过在二维坐标系中绘制数据点(每个点代表一个观测值)来揭示变量间的 相关性、分布模式或异常值。
适用场景
-
两个连续变量的相关性分析
-
聚类分析可视化
-
异常值检测
基础代码
import matplotlib.pyplot as plt
import numpy as np
# 生成示例数据
np.random.seed(42)
x = np.random.rand(50) * 10
y = 2 * x + np.random.randn(50) * 2
# 绘制散点图
plt.figure(figsize=(8, 6))
plt.scatter(x, y, c='steelblue', alpha=0.7, edgecolors='white', s=100)
plt.title('广告投入与销售额关系', fontsize=14)
plt.xlabel('广告投入(万元)', fontsize=12)
plt.ylabel('销售额(万元)', fontsize=12)
plt.grid(True, linestyle='--', alpha=0.5)
plt.show()
高级技巧
-
添加回归线:
from scipy import stats
slope, intercept, r_value, p_value, std_err = stats.linregress(x, y)
plt.plot(x, intercept + slope*x, 'r--', label=f'y={slope:.2f}x+{intercept:.2f}')
plt.legend()
-
气泡图效果:
sizes = np.random.randint(10, 200, size=50)
plt.scatter(x, y, s=sizes, alpha=0.5)
实践例子代码展示:
# 绘制简单散点图:用scatter()函数
import matplotlib.pyplot as plt
x=[1,2,3,4,5,6]
y=[19,24,37,43,55,68]
plt.scatter(x, y, color= 'r')
plt.show()
3. 折线图:展示趋势变化
折线图(Line Chart/Line Plot) 是一种通过 线段连接数据点 来展示 连续变量随时间或有序类别变化趋势 的可视化图表。它强调数据的 连续性、趋势和波动,是时间序列分析中最常用的工具之一。
适用场景
-
时间序列数据
-
连续变量变化趋势
-
多组数据对比
基础代码
# 示例数据
months = ['1月', '2月', '3月', '4月', '5月', '6月']
sales_A = [23, 45, 32, 56, 43, 67]
sales_B = [34, 28, 45, 38, 52, 49]
plt.figure(figsize=(10, 6))
plt.plot(months, sales_A, marker='o', label='产品A', linewidth=2)
plt.plot(months, sales_B, marker='s', label='产品B', linestyle='--')
plt.title('上半年产品销售趋势', fontsize=14)
plt.ylabel('销售额(万元)', fontsize=12)
plt.legend()
plt.grid(True, axis='y')
plt.show()
高级技巧
-
双Y轴折线图:
fig, ax1 = plt.subplots(figsize=(10,6))
ax1.plot(months, sales_A, 'b-', marker='o')
ax1.set_ylabel('产品A销售额', color='b')
ax2 = ax1.twinx()
ax2.plot(months, sales_B, 'r-', marker='s')
ax2.set_ylabel('产品B销售额', color='r')
-
面积图:
plt.stackplot(months, sales_A, sales_B, alpha=0.5)
实践例子代码展示:
import pandas as pd
import matplotlib.pyplot as plt
df1=pd.read_excel('data.xls') #导入Excel文件
#多折线图
x1=df1['姓名']
y1=df1['语文']
y2=df1['数学']
y3=df1['英语']
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
plt.rcParams['xtick.direction'] = 'out' #x轴的刻度线向外显示
plt.rcParams['ytick.direction'] = 'in' #y轴的刻度线向内显示
plt.title('语数外成绩大比拼',fontsize='18') #图表标题
plt.plot(x1,y1,label='语文',color='r',marker='p')
plt.plot(x1,y2,label='数学',color='g',marker='.',mfc='r',ms=8,alpha=0.7)
plt.plot(x1,y3,label='英语',color='b',linestyle='-.',marker='*')
plt.grid(axis='y') #显示网格关闭y轴
plt.ylabel('分数')
plt.yticks(range(50,150,10))
plt.legend(['语文','数学','英语']) #图例
plt.savefig('image.png')
plt.show()
4. 柱形图:比较分类数据
柱形图(Bar Chart) 是一种用 垂直或水平矩形条 表示 分类数据对比 的统计图表。每个柱子的高度(或长度)对应一个 离散类别 的数值大小,用于直观比较不同类别之间的差异。
适用场景
-
分类数据对比
-
时间序列的离散表示
-
多组数据并列比较
基础代码
categories = ['电子产品', '服装', '食品', '家居']
q1_sales = [45, 32, 28, 39]
q2_sales = [52, 38, 31, 43]
x = np.arange(len(categories))
width = 0.35
fig, ax = plt.subplots(figsize=(10,6))
rects1 = ax.bar(x - width/2, q1_sales, width, label='第一季度')
rects2 = ax.bar(x + width/2, q2_sales, width, label='第二季度')
ax.set_xticks(x)
ax.set_xticklabels(categories)
ax.legend()
# 添加数据标签
def autolabel(rects):
for rect in rects:
height = rect.get_height()
ax.annotate(f'{height}',
xy=(rect.get_x() + rect.get_width() / 2, height),
xytext=(0, 3),
textcoords="offset points",
ha='center', va='bottom')
autolabel(rects1)
autolabel(rects2)
plt.show()
变体图表
-
堆叠柱形图:
plt.bar(categories, q1_sales, label='Q1')
plt.bar(categories, q2_sales, bottom=q1_sales, label='Q2')
-
水平柱形图:
plt.barh(categories, q1_sales)
实践例子代码展示:
# 2025.05.15课堂作业(绘制柱形图图表)
# 根据“books.xlsx”表格的数据,绘制如下图形。 要求将代码和输出结果截图上传。
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_excel('books.xlsx')
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
x=df['年份']
height=df['销售额']
plt.grid(axis="y", which="major") # 只在y轴上生成虚线网格。which="major":只显示主刻度线对应的网格线
#x、y轴标签
plt.xlabel('年份')
plt.ylabel('线上销售额(元)')
#图表标题
plt.title('2013-2019年线上图书销售额分析图')
plt.bar(x,height,width = 0.5,align='center',color = 'b',alpha=0.5,bottom=0.8) #alpha=0.5透明度
#设置每个柱子的文本标签, format(b,',')格式化销售额为千位分隔符格式
#for a,b in zip(x,height):遍历x轴位置和柱形高度值
# plt.text() - 添加文本标签,具体参数解释如下:
# a - x坐标位置
# b - y坐标位置(柱形顶部)
# format(b,',') - 将数值格式化为带千位分隔符的字符串
# ha='center' - 水平对齐方式为居中
# va='bottom' - 垂直对齐方式为底部对齐
# fontsize=9 - 字体大小
# color='b' - 蓝色文本
# alpha=0.9 - 透明度0.9
for a,b in zip(x,height):
plt.text(a, b,format(b,','), ha='center', va= 'bottom',fontsize=9,color = 'b',alpha=0.9)
plt.legend(['销售额']) # 显示图例
5. 饼图:呈现比例构成
饼图(Pie Chart) 是一种用 圆形分割扇形区域 来展示 整体中各部分占比关系 的统计图表。每个扇区的面积(或弧长)对应一个类别的数值比例,适用于强调 部分与整体的构成关系。
适用场景
-
显示整体中各部分占比
-
强调某个重要组成部分
-
比例关系可视化
基础代码
labels = ['一线城市', '二线城市', '三线城市', '其他']
sizes = [45, 30, 15, 10]
explode = (0.1, 0, 0, 0) # 突出显示一线城市
plt.figure(figsize=(8,8))
plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
shadow=True, startangle=90)
plt.title('用户地域分布', fontsize=14)
plt.show()
高级技巧
-
环形图:
plt.pie(sizes, wedgeprops=dict(width=0.3))
-
多级饼图:
# 需要分层处理数据
实践例子代码展示:
# 代码 05-19
import pandas as pd
from matplotlib import pyplot as plt
df1 = pd.read_excel('data2.xlsx')
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
plt.figure(figsize=(5,3)) #设置画布大小
labels = df1['地区']
sizes = df1['销量']
#设置饼形图每块的颜色
colors = ['red', 'yellow', 'slateblue', 'green','magenta','cyan','darkorange','lawngreen','pink','gold']
# 分裂饼图参数:explode
explode = (0.1, 0,0,0,0,0,0,0,0,0)
plt.pie(sizes, #绘图数据
labels=labels,#添加区域水平标签
colors=colors,# 设置饼图的自定义填充色
labeldistance=1.02,#设置各扇形标签(图例)与圆心的距离
autopct='%.1f%%',# 设置百分比的格式,这里保留一位小数
startangle=90,# 设置饼图的初始角度
radius = 0.5, # 设置饼图的半径
center = (0.2,0.2), # 设置饼图的原点
textprops = {'fontsize':9, 'color':'k'}, # 设置文本标签的属性值
pctdistance=0.6, # 设置百分比标签与圆心的距离
explode=explode, #分裂饼图
shadow=True # 立体感带阴影饼图
)
# 设置x,y轴刻度一致,保证饼图为圆形
plt.axis('equal')
plt.title('2020年1月各地区销量占比情况分析')
6. 箱线图:分析数据分布
箱线图(Box Plot,又称盒须图) 是一种用于展示 数值数据分布特征 的统计图表,通过五数概括(最小值、第一四分位数、中位数、第三四分位数、最大值)和潜在异常值,直观反映数据的 离散程度、偏态和异常情况。
-
数据分布形态展示
-
异常值检测
-
多组数据分布比较
基础代码
# 生成示例数据
data = [np.random.normal(0, std, 100) for std in range(1,4)]
fig, ax = plt.subplots(figsize=(8,6))
ax.boxplot(data, vert=True, patch_artist=True,
labels=['组1', '组2', '组3'])
ax.set_title('三组数据分布比较')
plt.show()
元素解释
-
箱体:显示四分位距(IQR)
-
中线:中位数位置
-
须线:1.5倍IQR范围
-
离群点:超出须线的数据点
实践例子代码展示:
# 箱形图是一种用作显示一组数据分布情况的统计图,因型状如箱子而得名。箱子的顶端和底端,分别代表上下四分位数。
# 箱子中间的是中位数线,它将箱子一分为二。箱形图最大的优势是,它以一种简单的方式,概括出一个或多个数值变量的分布,
# 同时又不会占据太多空间。通过箱形图,我们可以很快知道一些关键的统计值,如中位数、上下四分位数等。
# 请读取表格“temperature.csv”数据,对 “temp”列的数据绘制箱形图。要求输出结果如下图。并读图。最后请将代码和输出结果截图上传。
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('temperature.csv')
aa = df['temp'].isna().sum() # 统计空值个数
print(aa)
# 删除 空值的行数据
df.dropna(subset=['temp'], inplace= True)
# 绘制箱线图
plt.boxplot(df['temp'])
plt.xlabel('列名')
plt.ylabel('温度值')
plt.title('箱型图')
7. 综合对比与选用指南
图表类型 | 最佳使用场景 | 需避免的情况 |
---|---|---|
散点图 | 展示两个连续变量关系 | 数据点过多导致重叠 |
折线图 | 时间序列或有序数据 | 非连续或无序分类数据 |
柱形图 | 分类数据比较 | 超过7-8个类别 |
饼图 | 显示整体中各部分占比 | 部分占比相近或类别过多 |
箱线图 | 数据分布形态分析 | 需要展示具体数据点 |
选用流程图:
-
要展示趋势?→ 折线图
-
要比较数值?→ 柱形图
-
要分析关系?→ 散点图
-
要显示构成?→ 饼图
-
要分析分布?→ 箱线图
8. 常见问题解答
Q1:中文显示乱码怎么办?
plt.rcParams['font.sans-serif'] = ['SimHei'] # Windows
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS'] # Mac
Q2:如何保存高清图片?
plt.savefig('output.png', dpi=300, bbox_inches='tight')
Q3:如何调整图例位置?
plt.legend(loc='upper right') # 其他选项:'best', 'upper left'等
9. 总结与资源
核心要点回顾:
-
散点图揭示变量关系
-
折线图展示趋势变化
-
柱形图用于分类比较
-
饼图显示比例构成
-
箱线图分析数据分布
进阶学习资源:
-
《Python数据可视化实战》
-
Seaborn库的高级统计图表
-
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。