使用 Python 进行数据可视化

使用 Python 进行数据可视化

使用 Pandas 进行 Matplotlib 绘图

图表类型 描述 Pandas 函数 示例
折线图 显示随时间变化的趋势和变化 DataFrame.plot.line()DataFrame.plot(kind='line') df.plot(x='year', y='sales', kind='line')
面积图 显示数据系列之间的关系,以填充区域呈现 DataFrame.plot.area()DataFrame.plot(kind='area') df.plot(kind='area')
直方图 显示数据在各个区间(箱)内的频数分布 Series.plot.hist()Series.plot(kind='hist', bins=n) s.plot(kind='hist', bins=10)
条形图 通过矩形条形显示数据 DataFrame.plot.bar()DataFrame.plot(kind='bar') df.plot(kind='bar')
饼图 以圆形分片显示数据比例 Series.plot.pie()DataFrame.plot.pie(y, labels) df.plot(x='Category', y='Percentage', kind='pie')
箱型图 展示数据的分布及关键统计指标 DataFrame.plot.box()DataFrame.plot(kind='box') df_can.plot(kind='box')
散点图 通过笛卡尔坐标系展示两个变量的关系 DataFrame.plot.scatter()DataFrame.plot(x, y, kind='scatter') df.plot(x='Height', y='Weight', kind='scatter')

直接使用 Matplotlib 进行绘图

绘图类型 描述 Matplotlib 函数 示例
折线图 显示趋势和随时间变化的情况 plt.plot() plt.plot(x, y, color='red', linewidth=2)
区域图 显示填充区域的变化趋势 plt.fill_between() plt.fill_between(x, y1, y2, color='blue', alpha=0.5)
直方图 显示数据的频数分布 plt.hist() plt.hist(data, bins=10, color='orange', edgecolor='black')
条形图 通过矩形条展示数据 plt.bar() plt.bar(x, height, color='green', width=0.5)
饼图 显示数据的比例或百分比 plt.pie() plt.pie(sizes, labels=labels, colors=colors, explode=explode)
箱型图 显示数据的分布及统计特征 plt.boxplot() plt.boxplot(data, notch=True)
散点图 通过点显示两个变量之间的关系 plt.scatter() plt.scatter(x, y, color='purple', marker='o', s=50)
子图 在一个图形中创建多个子图 plt.subplots() fig, axes = plt.subplots(nrows=2, ncols=2)
自定义 自定义绘图(标题、标签、图例、网格) plt.title() plt.xlabel() plt.ylabel() plt.legend() plt.grid() plt.title('标题') plt.xlabel('X 轴') plt.ylabel('Y 轴') plt.legend() plt.grid(True)

这样整理后,内容更清晰,查找更方便!🚀

Matplotlib 子图(Subplots)解析

Matplotlib 子图(Subplots)解析

子图(Subplots)可以帮助我们在 同一个画布(figure) 上绘制多个不同的图表,方便进行 数据对比展示多个视角 的数据。


1. 什么是 figuresubplot

  • figure:整个 画布(canvas),包含一个或多个子图。
  • subplot:画布上的 单个子图,可以包含不同类型的图表。

在 Matplotlib 中,我们可以使用 plt.subplots() 来创建多个子图:

1
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(12, 6))
  • nrows=1, ncols=2:表示 创建 1 行 2 列的子图(即两个并排的图)。
  • figsize=(12, 6):设置 整体画布大小

2. 子图示例

我们以 中国(China)和印度(India)的移民数据 为例,绘制:

  1. 箱线图(Boxplot)
  2. 折线图(Line plot)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import matplotlib.pyplot as plt

# 创建画布,1 行 2 列的子图
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(12, 6))

# 绘制箱线图(左侧子图)
df[['China', 'India']].plot(kind='box', ax=axes[0], color='blue')
axes[0].set_title('Box plot of China & India Immigration')

# 绘制折线图(右侧子图)
df[['China', 'India']].plot(kind='line', ax=axes[1])
axes[1].set_title('Line plot of China & India Immigration')

# 调整布局,使图表不重叠
plt.tight_layout()

# 显示图表
plt.show()

3. 代码解析

(1) 创建 1 行 2 列的子图

1
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(12, 6))
  • nrows=1, ncols=2:创建 一行两列 的子图布局。
  • figsize=(12, 6):设置 画布大小

(2) 绘制箱线图

1
2
df[['China', 'India']].plot(kind='box', ax=axes[0], color='blue')
axes[0].set_title('Box plot of China & India Immigration')
  • ax=axes[0]:指定绘制到 第 1 个子图(左侧)
  • set_title():设置 子图标题

(3) 绘制折线图

1
2
df[['China', 'India']].plot(kind='line', ax=axes[1])
axes[1].set_title('Line plot of China & India Immigration')
  • ax=axes[1]:指定绘制到 第 2 个子图(右侧)

(4) 调整布局

1
plt.tight_layout()
  • 这个函数 自动调整子图的间距,避免重叠。

(5) 显示图表

1
plt.show()

4. 结果

左侧子图(箱线图):显示中国和印度移民数量的分布情况。
右侧子图(折线图):显示移民数量的变化趋势。
整体布局清晰、易读,适用于数据对比


5. 其他子图布局

除了 1x2 的布局,我们还可以使用其他布局:

(1) 2x2 子图

1
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 8))

这将创建一个 2 行 2 列的网格布局,适合显示 4 个图。

(2) 不规则布局(GridSpec)

如果想要 不同大小的子图,可以用 GridSpec

1
2
3
4
5
6
7
8
import matplotlib.gridspec as gridspec

fig = plt.figure(figsize=(10, 8))
gs = gridspec.GridSpec(2, 2, height_ratios=[2, 1])

ax1 = plt.subplot(gs[0, :]) # 第 1 行,占满 2 列
ax2 = plt.subplot(gs[1, 0]) # 第 2 行,左侧
ax3 = plt.subplot(gs[1, 1]) # 第 2 行,右侧
  • 上方大图,下方两张小图

总结

  • plt.subplots() 可以创建多个子图,便于 数据对比
  • ax=axes[i] 指定不同的子图位置。
  • plt.tight_layout() 避免子图重叠。
  • GridSpec 适用于 不规则子图布局

这样,我们可以 高效可视化 数据! 🎉

Matplotlib所有可用样式

Matplotlib 提供的所有可用样式(style)及其特点介绍:


1. 经典风格

  • classic:Matplotlib 旧版的默认风格,颜色较淡,线条较细,适合习惯早期 Matplotlib 风格的用户。
  • _classic_test_patch:一个用于测试的经典风格,与 classic 类似,主要用于 Matplotlib 内部测试。

2. 现代流行风格

  • ggplot:模仿 R 语言的 ggplot2 主题,使用柔和的颜色,带有网格线,适用于数据分析和统计图表。
  • fivethirtyeight:模仿 FiveThirtyEight 网站的数据可视化风格,线条较粗,颜色鲜明,背景为浅灰色,适合数据新闻或高对比度展示。
  • bmh(Bayesian Methods for Hackers):
    • 适合统计分析,背景较浅,网格线清晰,线条较粗。
    • 适用于数据科学、统计建模和机器学习可视化。
  • fast
    • 牺牲部分视觉效果,提升渲染速度,适用于大规模数据集的快速可视化。

3. 深色主题

  • dark_background
    • 黑色背景,适合夜间模式或需要高对比度的可视化展示。
    • 适用于投影仪演示或屏幕展示。
  • seaborn-v0_8-dark
    • Seaborn 主题,深色背景,适合夜间模式的可视化。
  • seaborn-v0_8-dark-palette
    • 深色背景,搭配 Seaborn 颜色方案,颜色较丰富,适合数据展示。
  • seaborn-v0_8-darkgrid
    • 深色背景 + 网格线,适用于数据趋势分析。

4. 浅色主题

  • seaborn-v0_8-white
    • 纯白背景,无网格线,适合简洁风格。
  • seaborn-v0_8-whitegrid
    • 白色背景,带网格线,适合统计数据可视化。

5. 论文、报告风格

  • seaborn-v0_8-paper
    • 适用于学术论文格式,配色简洁,适合黑白打印。
  • seaborn-v0_8-notebook
    • 适用于 Jupyter Notebook 环境,可读性强。
  • seaborn-v0_8-poster
    • 适用于海报或大屏幕展示,字号较大,线条较粗。
  • seaborn-v0_8-talk
    • 适用于演讲或 PPT 展示,增强了对比度和字体大小。

6. 适合出版或色盲友好的风格

  • grayscale
    • 所有颜色变成灰阶,适合黑白打印或研究色彩对比。
  • tableau-colorblind10
    • 适用于色盲用户的 Tableau 颜色方案,提高可读性。

7. Seaborn 主题系列

这些风格都属于 Seaborn 主题,可用于增强 Matplotlib 的可视化美观性:

  • seaborn-v0_8(默认 Seaborn 主题)。
  • seaborn-v0_8-bright(明亮色彩)。
  • seaborn-v0_8-colorblind(色盲友好)。
  • seaborn-v0_8-deep(更深的颜色)。
  • seaborn-v0_8-muted(柔和色调)。
  • seaborn-v0_8-pastel(淡色)。
  • seaborn-v0_8-ticks(适用于带刻度的图表)。

示例:对比不同风格

你可以使用以下代码来快速查看不同风格的效果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)
y = np.sin(x)

styles = ['ggplot', 'fivethirtyeight', 'seaborn-v0_8-darkgrid', 'dark_background']

for style in styles:
plt.style.use(style)
plt.figure()
plt.plot(x, y, label=f"Style: {style}")
plt.legend()
plt.title(f"Matplotlib Style: {style}")
plt.show()