第149集 简单数据可视化
1. 数据可视化概述
数据可视化是将数据转化为直观图表的过程,帮助我们更好地理解数据的分布、趋势和关系。Python提供了丰富的数据可视化库,其中最常用的是Matplotlib和Seaborn。
1.1 为什么需要数据可视化
- 直观理解:将抽象的数据转化为直观的图形,便于理解数据特征
- 发现规律:帮助发现数据中的模式、趋势和异常值
- 有效沟通:更清晰地向他人传达数据分析结果
- 辅助决策:基于可视化结果做出更明智的决策
1.2 常用可视化库
- Matplotlib:Python最基础的可视化库,提供底层绘图功能
- Seaborn:基于Matplotlib的高级可视化库,提供更美观的默认样式和更便捷的API
- Plotly:交互式可视化库,支持创建可交互的图表
- Pandas:内置简单的可视化功能,基于Matplotlib
2. Matplotlib基础
2.1 安装与导入
# 安装matplotlib
# pip install matplotlib
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd2.2 基本绘图流程
# 1. 准备数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 2. 创建画布
plt.figure(figsize=(8, 6))
# 3. 绘制图形
plt.plot(x, y)
# 4. 添加标题和标签
plt.title('正弦函数曲线')
plt.xlabel('x轴')
plt.ylabel('y轴')
# 5. 显示网格
plt.grid(True)
# 6. 显示图形
plt.show()2.3 常用图表类型
2.3.1 折线图
# 准备数据
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
# 绘制折线图
plt.figure(figsize=(8, 6))
plt.plot(x, y, color='blue', linestyle='-', marker='o', linewidth=2, markersize=8)
plt.title('简单折线图')
plt.xlabel('x值')
plt.ylabel('y值')
plt.grid(True)
plt.show()2.3.2 散点图
# 准备数据
x = np.random.rand(50)
y = np.random.rand(50)
colors = np.random.rand(50)
sizes = 1000 * np.random.rand(50)
# 绘制散点图
plt.figure(figsize=(8, 6))
plt.scatter(x, y, c=colors, s=sizes, alpha=0.5, cmap='viridis')
plt.colorbar(label='颜色值')
plt.title('随机散点图')
plt.xlabel('x轴')
plt.ylabel('y轴')
plt.grid(True)
plt.show()2.3.3 柱状图
# 准备数据
categories = ['A', 'B', 'C', 'D', 'E']
values = [23, 56, 41, 62, 38]
# 绘制柱状图
plt.figure(figsize=(8, 6))
plt.bar(categories, values, color='skyblue', width=0.6)
plt.title('分类柱状图')
plt.xlabel('类别')
plt.ylabel('数值')
plt.grid(True, axis='y')
plt.show()
# 水平柱状图
plt.figure(figsize=(8, 6))
plt.barh(categories, values, color='lightgreen')
plt.title('水平柱状图')
plt.xlabel('数值')
plt.ylabel('类别')
plt.grid(True, axis='x')
plt.show()2.3.4 直方图
# 准备数据
data = np.random.randn(1000) # 生成1000个标准正态分布的随机数
# 绘制直方图
plt.figure(figsize=(8, 6))
plt.hist(data, bins=30, color='purple', alpha=0.7, edgecolor='black')
plt.title('数据分布直方图')
plt.xlabel('数值')
plt.ylabel('频率')
plt.grid(True, axis='y')
plt.show()2.3.5 饼图
# 准备数据
labels = ['苹果', '香蕉', '橙子', '葡萄']
sizes = [30, 25, 20, 25]
colors = ['red', 'yellow', 'orange', 'purple']
explode = (0.1, 0, 0, 0) # 突出显示第一个部分
# 绘制饼图
plt.figure(figsize=(8, 6))
plt.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', shadow=True, startangle=90)
plt.axis('equal') # 保证饼图是圆形
plt.title('水果销售比例')
plt.show()3. Seaborn基础
3.1 安装与导入
# 安装seaborn
# pip install seaborn
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 设置seaborn风格
sns.set_style("whitegrid")3.2 常用图表类型
3.2.1 箱线图
# 准备数据
data = np.random.randn(1000, 4)
df = pd.DataFrame(data, columns=['A', 'B', 'C', 'D'])
# 绘制箱线图
plt.figure(figsize=(8, 6))
sns.boxplot(data=df)
plt.title('多列数据箱线图')
plt.xlabel('列名')
plt.ylabel('数值')
plt.show()3.2.2 小提琴图
# 绘制小提琴图
plt.figure(figsize=(8, 6))
sns.violinplot(data=df)
plt.title('多列数据小提琴图')
plt.xlabel('列名')
plt.ylabel('数值')
plt.show()3.2.3 热力图
# 准备数据
corr_matrix = df.corr()
# 绘制热力图
plt.figure(figsize=(8, 6))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', fmt='.2f', square=True)
plt.title('相关性热力图')
plt.show()3.2.4 联合分布图
# 准备数据
x = np.random.randn(1000)
y = np.random.randn(1000)
# 绘制联合分布图
plt.figure(figsize=(8, 6))
sns.jointplot(x=x, y=y, kind='scatter', color='blue')
plt.suptitle('联合分布图', y=1.02)
plt.show()4. Pandas内置可视化
Pandas提供了简单的可视化功能,基于Matplotlib,可以直接对DataFrame和Series进行绘图。
# 创建示例数据
dates = pd.date_range('2023-01-01', periods=30)
df = pd.DataFrame({
'A': np.random.randn(30).cumsum(),
'B': np.random.randn(30).cumsum(),
'C': np.random.randn(30).cumsum()
}, index=dates)
# 折线图
df.plot(figsize=(8, 6), title='Pandas折线图')
plt.grid(True)
plt.show()
# 柱状图
df.plot.bar(figsize=(10, 6), title='Pandas柱状图')
plt.grid(True)
plt.show()
# 箱线图
df.plot.box(figsize=(8, 6), title='Pandas箱线图')
plt.grid(True)
plt.show()
# 直方图
df.plot.hist(figsize=(8, 6), title='Pandas直方图', alpha=0.7)
plt.grid(True)
plt.show()5. 多图布局
5.1 使用subplot
# 创建一个2x2的子图布局
plt.figure(figsize=(12, 10))
# 第一个子图
plt.subplot(2, 2, 1)
plt.plot(np.random.randn(100).cumsum(), 'r-')
plt.title('子图1:随机漫步')
plt.grid(True)
# 第二个子图
plt.subplot(2, 2, 2)
plt.hist(np.random.randn(1000), bins=30, color='green', alpha=0.7)
plt.title('子图2:直方图')
plt.grid(True)
# 第三个子图
plt.subplot(2, 2, 3)
plt.scatter(np.random.rand(50), np.random.rand(50), c=np.random.rand(50), cmap='viridis')
plt.title('子图3:散点图')
plt.grid(True)
# 第四个子图
plt.subplot(2, 2, 4)
categories = ['A', 'B', 'C', 'D']
values = [23, 56, 41, 62]
plt.bar(categories, values, color='skyblue')
plt.title('子图4:柱状图')
plt.grid(True, axis='y')
plt.tight_layout() # 自动调整子图间距
plt.show()6. 图表样式与美化
6.1 设置Matplotlib样式
# 查看可用样式
print(plt.style.available)
# 使用样式
plt.style.use('ggplot') # 使用ggplot样式
# 准备数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# 绘制图形
plt.figure(figsize=(8, 6))
plt.plot(x, y1, label='sin(x)', linewidth=2)
plt.plot(x, y2, label='cos(x)', linewidth=2, linestyle='--')
plt.title('正弦和余弦函数')
plt.xlabel('x轴')
plt.ylabel('y轴')
plt.legend() # 显示图例
plt.grid(True)
plt.show()6.2 自定义颜色和样式
# 准备数据
x = [1, 2, 3, 4, 5]
y1 = [2, 4, 6, 8, 10]
y2 = [1, 3, 5, 7, 9]
# 绘制图形
plt.figure(figsize=(8, 6))
plt.plot(x, y1, 'ro-', label='数据1', linewidth=2, markersize=8)
plt.plot(x, y2, 'b^--', label='数据2', linewidth=2, markersize=8)
plt.title('自定义样式的折线图')
plt.xlabel('x轴')
plt.ylabel('y轴')
plt.legend()
plt.grid(True)
plt.show()7. 实战案例:销售数据分析可视化
# 创建销售数据
data = {
'月份': ['1月', '2月', '3月', '4月', '5月', '6月'],
'销售额': [12000, 15000, 18000, 14000, 20000, 22000],
'利润': [3000, 4000, 4500, 3500, 5000, 5500],
'客户数': [80, 95, 110, 90, 120, 130]
}
# 创建DataFrame
sales_df = pd.DataFrame(data)
# 1. 销售额和利润折线图
plt.figure(figsize=(10, 6))
plt.plot(sales_df['月份'], sales_df['销售额'], 'ro-', label='销售额', linewidth=2, markersize=8)
plt.plot(sales_df['月份'], sales_df['利润'], 'b^--', label='利润', linewidth=2, markersize=8)
plt.title('2023年上半年销售趋势')
plt.xlabel('月份')
plt.ylabel('金额(元)')
plt.legend()
plt.grid(True)
plt.show()
# 2. 客户数柱状图
plt.figure(figsize=(10, 6))
plt.bar(sales_df['月份'], sales_df['客户数'], color='skyblue', width=0.6)
plt.title('2023年上半年客户数量')
plt.xlabel('月份')
plt.ylabel('客户数')
plt.grid(True, axis='y')
plt.show()
# 3. 销售额和客户数散点图
plt.figure(figsize=(8, 6))
plt.scatter(sales_df['客户数'], sales_df['销售额'], color='purple', s=100, alpha=0.7)
plt.title('销售额与客户数关系')
plt.xlabel('客户数')
plt.ylabel('销售额(元)')
plt.grid(True)
# 添加趋势线
z = np.polyfit(sales_df['客户数'], sales_df['销售额'], 1)
p = np.poly1d(z)
plt.plot(sales_df['客户数'], p(sales_df['客户数']), "r--")
plt.show()
# 4. 多图布局
plt.figure(figsize=(14, 10))
# 销售额折线图
plt.subplot(2, 2, 1)
plt.plot(sales_df['月份'], sales_df['销售额'], 'r-', linewidth=2)
plt.title('销售额趋势')
plt.grid(True)
# 利润折线图
plt.subplot(2, 2, 2)
plt.plot(sales_df['月份'], sales_df['利润'], 'g-', linewidth=2)
plt.title('利润趋势')
plt.grid(True)
# 客户数柱状图
plt.subplot(2, 2, 3)
plt.bar(sales_df['月份'], sales_df['客户数'], color='skyblue')
plt.title('客户数量')
plt.grid(True, axis='y')
# 销售额与利润关系
plt.subplot(2, 2, 4)
plt.scatter(sales_df['销售额'], sales_df['利润'], color='purple', s=100)
plt.title('销售额与利润关系')
plt.xlabel('销售额(元)')
plt.ylabel('利润(元)')
plt.grid(True)
plt.tight_layout()
plt.show()8. 总结
本集介绍了Python中常用的数据可视化方法,包括:
- Matplotlib基础:折线图、散点图、柱状图、直方图、饼图等
- Seaborn基础:箱线图、小提琴图、热力图、联合分布图等
- Pandas内置可视化:直接对DataFrame进行绘图
- 多图布局:使用subplot创建多图布局
- 图表样式与美化:设置样式、自定义颜色和样式
- 实战案例:销售数据分析可视化
数据可视化是数据分析过程中的重要环节,通过直观的图表可以帮助我们更好地理解和分析数据。在实际应用中,需要根据数据类型和分析目的选择合适的图表类型。
9. 练习
- 创建一个包含50个随机数的数据集,绘制折线图、散点图和直方图
- 使用Seaborn绘制一个箱线图和一个小提琴图,比较不同组数据的分布
- 创建一个包含两列相关数据的DataFrame,绘制散点图并添加趋势线
- 使用Pandas绘制一个时间序列数据的折线图
- 创建一个4x4的子图布局,绘制不同类型的图表
- 收集一组实际数据(如销售数据、学生成绩等),绘制多种图表进行分析