数据可视化
问题
Python 中有哪些数据可视化库?如何选择?
答案
Matplotlib(基础)
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
# 折线图
axes[0].plot(x, np.sin(x), label="sin(x)", color="blue")
axes[0].plot(x, np.cos(x), label="cos(x)", color="red")
axes[0].set_title("三角函数")
axes[0].legend()
axes[0].grid(True)
# 柱状图
categories = ["A", "B", "C", "D"]
values = [23, 45, 56, 78]
axes[1].bar(categories, values, color=["#FF6B6B", "#4ECDC4", "#45B7D1", "#96CEB4"])
axes[1].set_title("分类对比")
plt.tight_layout()
plt.savefig("chart.png", dpi=150)
Seaborn(统计可视化)
基于 Matplotlib,专为统计图表设计:
import seaborn as sns
import pandas as pd
df = sns.load_dataset("tips")
# 分布图
sns.histplot(df["total_bill"], kde=True)
# 关系图
sns.scatterplot(data=df, x="total_bill", y="tip", hue="day", size="size")
# 热力图
corr = df.select_dtypes(include="number").corr()
sns.heatmap(corr, annot=True, cmap="coolwarm")
# 箱线图
sns.boxplot(data=df, x="day", y="total_bill")
Plotly(交互式)
import plotly.express as px
df = px.data.gapminder()
# 交互式散点图
fig = px.scatter(
df.query("year == 2007"),
x="gdpPercap", y="lifeExp",
size="pop", color="continent",
hover_name="country",
log_x=True, size_max=60,
)
fig.show()
# 动画
fig = px.scatter(
df, x="gdpPercap", y="lifeExp",
animation_frame="year", animation_group="country",
size="pop", color="continent",
)
库选择
| 库 | 类型 | 适用场景 |
|---|---|---|
| Matplotlib | 静态 | 论文、报告、底层定制 |
| Seaborn | 统计 | 探索性分析、统计图 |
| Plotly | 交互 | Dashboard、Web 展示 |
| Altair | 声明式 | 快速探索分析 |
| Bokeh | 交互 | 大数据交互可视化 |
常见面试问题
Q1: Matplotlib 和 Seaborn 的关系?
答案:
Seaborn 是 Matplotlib 的高级封装。Seaborn 提供更美观的默认样式和统计图表,底层仍然是 Matplotlib。可以混合使用——用 Seaborn 快速画图,用 Matplotlib 微调细节。
Q2: 如何选择图表类型?
答案:
| 数据关系 | 推荐图表 |
|---|---|
| 趋势变化 | 折线图 |
| 分类对比 | 柱状图 |
| 分布 | 直方图、箱线图 |
| 相关性 | 散点图、热力图 |
| 组成比例 | 饼图、堆叠柱状图 |
Q3: 大数据量可视化怎么优化?
答案:
- 降采样:数据量太大时采样显示
- WebGL 渲染:Plotly 的
scattergl比scatter快 10x - 分块渲染:Datashader 可以处理亿级数据
- 静态输出:大数据量用 Matplotlib 导出图片,避免交互渲染开销