Python 数据分析进阶:数据可视化与报告
本文介绍了Python数据可视化的核心技术与实践方法。重点讲解了Matplotlib、Seaborn和Plotly三大库的使用场景:Matplotlib用于基础图表绘制,Seaborn适合统计可视化,Plotly则用于交互式图表。文章通过电商销售数据分析案例,详细演示了从数据清洗到可视化呈现的全流程,包括折线图、柱状图、热力图等常用图表类型,并分享了配色方案、字体设置等优化技巧。最后推荐了Jupy
引言
因为我每天都要处理成千上万条数据。如果用Excel画图,每次改个参数都要手动调整,效率低得要命。而且当你需要实时更新、制作交互式报告、或者批量生成几十个图表时,Excel基本就歇菜了。
Python的可视化强在三点:
1. 自动化能力:代码写一次,重复执行一万次都一样精准
2. 灵活性:从简单的折线图到复杂的3D交互图表,想怎么做都能实现
3. 生态完整:从数据清洗到可视化再到报告生成,整个流程都能打通
本教程会讲三个核心库:
• Matplotlib:基础可视化库,几乎所有其他库都建立在它之上
• Seaborn:基于Matplotlib的高级库,专门用于统计可视化,默认样式就很漂 亮
• Plotly:交互式可视化库,可以生成可缩放、可拖拽的动态图表
先说个我踩过的坑:刚开始学的时候我试图一口气把三个库全学会,结果越学越乱。后来发现应该这样:
Matplotlib用来理解基础概念(怎么画坐标轴、怎么改样式),Seaborn用来快速出好看的统计图表,Plotly用来做需要交互的场景。这样学习路径清晰很多。
环境准备
安装其实很简单,但有几个细节要注意。
首先安装基础库:
pip install matplotlib seaborn plotly pandas numpy jupyter
我建议用虚拟环境,不然以后项目多了容易冲突:
python -m venv venv
source venv/bin/activate # Linux/Mac
# 或者
venv\Scripts\activate # Windows
pip install matplotlib seaborn plotly pandas numpy jupyter
安装完成后,启动Jupyter Notebook:
jupyter notebook
现在来做几个基础配置,这些设置能让你的图表默认就好看很多:
# 在Jupyter Notebook中直接显示图表
%matplotlib inline
# 导入库
import matplotlib.pyplot as plt
import seaborn as sns
import plotly.express as px
import pandas as pd
import numpy as np
# 中文显示设置(这个很重要,不然中文会显示成方块)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# Seaborn样式设置
sns.set_style('whitegrid') # 设置背景样式
sns.set_context('notebook', font_scale=1.2) # 设置字体大小
# 设置图表默认大小
plt.rcParams['figure.figsize'] = (12, 6)
这里有个坑点:中文设置在Linux/Mac上可能需要不同的字体,比如Arial Unicode MS。如果显示不出来,可以用以下代码查看系统有哪些字体:
from matplotlib.font_manager import FontManager
import matplotlib.font_manager as fm
fonts = set([f.name for f in fm.fontManager.ttflist])
print(sorted(fonts)[:20]) # 打印前20个字体
核心可视化技术
基础图表
先从最基础的折线图开始。这个图表我最常用,比如展示时间序列数据。
# 生成模拟数据
dates = pd.date_range('2025-01-01', '2025-01-31', freq='D')
sales = np.random.normal(1000, 200, len(dates)).cumsum()
# 基础折线图
plt.figure(figsize=(14, 6))
plt.plot(dates, sales, linewidth=2, color='#2ecc71')
# 添加标题和标签
plt.title('2025年1月销售趋势', fontsize=16, pad=20)
plt.xlabel('日期', fontsize=12)
plt.ylabel('累计销售额(元)', fontsize=12)
# 添加网格线
plt.grid(True, linestyle='--', alpha=0.6)
# 格式化x轴日期
import matplotlib.dates as mdates
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m-%d'))
plt.gca().xaxis.set_major_locator(mdates.WeekdayLocator(byweekday=mdates.MO))
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
这里有个细节:tight_layout()这个函数很关键,它能自动调整图表边距,防止标签被截断。我刚开始的时候经常忘了加,结果图表总是少半边。
接下来是柱状图,这个适合对比分类数据。
# 生成分类数据
categories = ['产品A', '产品B', '产品C', '产品D', '产品E']
values = [120, 85, 90, 110, 95]
# 绘制柱状图
plt.figure(figsize=(12, 6))
bars = plt.bar(categories, values, color=['#3498db', '#e74c3c', '#2ecc71', '#f39c12', '#9b59b6'])
# 在柱子上添加数值标签
for bar in bars:
height = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2., height,
f'{height}',
ha='center', va='bottom', fontsize=12)
# 添加标题
plt.title('各产品销售额对比', fontsize=16, pad=20)
plt.xlabel('产品名称', fontsize=12)
plt.ylabel('销售额(万元)', fontsize=12)
# 设置y轴范围,让标签不贴边
plt.ylim(0, max(values) * 1.1)
plt.tight_layout()
plt.show()
散点图我用来做相关性分析特别好用。比如分析广告投入和销售额的关系。
# 生成模拟数据
np.random.seed(42)
ad_spend = np.random.uniform(10, 100, 100)
sales = 20 + 1.5 * ad_spend + np.random.normal(0, 10, 100)
# 绘制散点图
plt.figure(figsize=(10, 6))
plt.scatter(ad_spend, sales, alpha=0.6, s=80, c=ad_spend, cmap='viridis')
# 添加趋势线
z = np.polyfit(ad_spend, sales, 1)
p = np.poly1d(z)
plt.plot(ad_spend, p(ad_spend), "r--", alpha=0.8, linewidth=2, label='趋势线')
# 添加标题和标签
plt.title('广告投入与销售额关系', fontsize=16, pad=20)
plt.xlabel('广告投入(万元)', fontsize=12)
plt.ylabel('销售额(万元)', fontsize=12)
plt.legend()
# 添加颜色条
plt.colorbar(label='广告投入')
plt.tight_layout()
plt.show()
高级可视化
热力图是我做相关性分析时的必备工具。特别是做特征工程时,一眼就能看出哪些变量高度相关。
# 生成模拟数据
np.random.seed(42)
data = pd.DataFrame({
'销售额': np.random.normal(100, 20, 100),
'广告投入': np.random.normal(30, 10, 100),
'客户数': np.random.normal(50, 15, 100),
'转化率': np.random.uniform(0.01, 0.05, 100),
'客单价': np.random.normal(200, 50, 100)
})
# 计算相关系数矩阵
corr = data.corr()
# 绘制热力图
plt.figure(figsize=(10, 8))
sns.heatmap(corr, annot=True, cmap='coolwarm', center=0,
square=True, linewidths=1, cbar_kws={"shrink": 0.8},
fmt='.2f', vmin=-1, vmax=1)
plt.title('变量相关性热力图', fontsize=16, pad=20)
plt.tight_layout()
plt.show()
这里有个小技巧:annot=True会在每个格子里显示数值,fmt='.2f'控制小数位数。我一般设置2位小数,太多太乱。
树状图(Treemap)我用来做占比可视化比饼图清晰多了,特别是分类比较多的时候。
import plotly.express as px
# 生成模拟数据
data = pd.DataFrame({
'类别': ['电子产品', '服装', '食品', '家居', '美妆', '运动', '书籍', '其他'],
'销售额': [45000, 32000, 28000, 15000, 18000, 12000, 8000, 5000]
})
# 绘制树状图
fig = px.treemap(data, path=['类别'], values='销售额',
title='各类别销售额占比',
color='销售额',
color_continuous_scale='Viridis')
fig.update_traces(textinfo='label+value+percent parent')
fig.update_layout(title_font_size=16)
fig.show()
交互式图表是我最近经常用的,特别是需要做展示的时候。
# 生成时间序列数据
dates = pd.date_range('2024-01-01', '2025-12-31', freq='M')
values = np.random.normal(100, 20, len(dates)).cumsum()
# 创建交互式折线图
fig = px.line(x=dates, y=values,
title='2024-2025年销售额趋势',
labels={'x': '日期', 'y': '累计销售额(元)'})
# 添加滑块和选择器
fig.update_layout(
xaxis=dict(
rangeslider=dict(visible=True),
type="date"
)
)
# 添加hover信息
fig.update_traces(
hovertemplate='<b>日期</b>: %{x}<br>' +
'<b>销售额</b>: %{y:,.0f}元<extra></extra>'
)
fig.show()
(注:交互式图表可缩放、拖拽、显示详细信息,此处展示静态版本)
图表优化技巧
配色这块我踩过很多坑。刚开始直接用默认颜色,结果做汇报时被老板说"太丑了"。
后来我整理了一套配色方案:
# 定义配色方案
colors = {
'primary': '#3498db', # 主色-蓝色
'success': '#2ecc71', # 成功-绿色
'warning': '#f39c12', # 警告-橙色
'danger': '#e74c3c', # 危险-红色
'info': '#9b59b6', # 信息-紫色
'gray': '#95a5a6' # 中性-灰色
}
# 自定义配色调色板
custom_palette = [colors['primary'], colors['success'], colors['warning'],
colors['danger'], colors['info']]
# 使用示例
plt.figure(figsize=(12, 6))
plt.bar(['A', 'B', 'C', 'D', 'E'], [23, 45, 56, 78, 32],
color=custom_palette)
plt.title('自定义配色示例', fontsize=16)
plt.tight_layout()
plt.show()
字体设置也很重要,我一般统一设置:
# 全局字体设置
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = ['SimHei'] # 中文用黑体
plt.rcParams['font.size'] = 12
plt.rcParams['axes.titlesize'] = 14
plt.rcParams['axes.labelsize'] = 12
plt.rcParams['xtick.labelsize'] = 10
plt.rcParams['ytick.labelsize'] = 10
# 标题加粗
plt.rcParams['axes.titleweight'] = 'bold'
布局优化这块,subplot经常用:
# 创建2x2子图
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# 第一个图:折线图
axes[0, 0].plot(dates, sales)
axes[0, 0].set_title('销售趋势')
axes[0, 0].set_ylabel('销售额')
# 第二个图:柱状图
axes[0, 1].bar(categories, values)
axes[0, 1].set_title('产品对比')
axes[0, 1].set_ylabel('销售额')
# 第三个图:散点图
axes[1, 0].scatter(ad_spend, sales, alpha=0.6)
axes[1, 0].set_title('广告与销售关系')
axes[1, 0].set_xlabel('广告投入')
axes[1, 0].set_ylabel('销售额')
# 第四个图:箱线图
axes[1, 1].boxplot([np.random.normal(100, 20, 100) for _ in range(4)])
axes[1, 1].set_title('各季度数据分布')
axes[1, 1].set_xticklabels(['Q1', 'Q2', 'Q3', 'Q4'])
plt.tight_layout()
plt.show()
数据报告自动化
Jupyter Notebook做报告简直是神器。我之前每周做周报要花半天时间,现在半小时就能搞定。
使用Jupyter Notebook生成可交互报告
先创建一个Notebook,然后按这个结构来:
# 销售数据分析周报
**日期**: 2025年1月6日 - 2025年1月12日
**分析师**: [你的名字]
---
## 1. 数据概览
然后在代码单元格里写:
# 导入数据
df = pd.read_csv('sales_data.csv')
# 显示数据概览
display(df.head())
display(df.describe())
## 2. 销售趋势分析
# 绘制销售趋势
plt.figure(figsize=(14, 6))
plt.plot(df['date'], df['sales'])
plt.title('本周销售趋势')
plt.xlabel('日期')
plt.ylabel('销售额')
plt.xticks(rotation=45)
plt.grid(True)
plt.show()
最后导出为HTML:
# 在Jupyter中导出为HTML
!jupyter nbconvert sales_report.ipynb --to html --no-input
结合Markdown与可视化
在Notebook里,你可以混合使用Markdown和代码:
## 3. 关键指标
本周关键业务指标:
- **总销售额**: 125万元 (环比增长12%)
- **订单数**: 3,450单 (环比增长8%)
- **客单价**: 362元 (环比增长3.7%)
详细分析如下:
# 计算环比增长
本周销售额 = 125
上周销售额 = 111.6
环比增长 = (本周销售额 - 上周销售额) / 上周销售额 * 100
print(f'环比增长: {环比增长:.1f}%')
导出为PDF/HTML
导出PDF需要安装一些依赖:
# 导出PDF
!jupyter nbconvert report.ipynb --to pdf
# 导出HTML(不显示代码)
!jupyter nbconvert report.ipynb --to html --no-input
# 导出HTML(显示代码)
!jupyter nbconvert report.ipynb --to html
然后导出:
# 导出PDF
!jupyter nbconvert report.ipynb --to pdf
# 导出HTML(不显示代码)
!jupyter nbconvert report.ipynb --to html --no-input
# 导出HTML(显示代码)
!jupyter nbconvert report.ipynb --to html
我常用的导出命令:
# 完整版报告(包含代码)
jupyter nbconvert report.ipynb --to html --template classic
# 简洁版报告(不包含代码,只显示输出)
jupyter nbconvert report.ipynb --to html --no-input --no-prompt
# PDF报告
jupyter nbconvert report.ipynb --to pdf
实战案例
来做个完整的案例分析,从数据清洗到可视化呈现。
场景设定
假设你是一家电商公司的数据分析师,需要分析2025年1月的销售数据,找出销售趋势、产品表现和用户行为特征。
1. 数据准备与清洗
# 导入库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 设置显示选项
pd.set_option('display.max_columns', None)
pd.set_option('display.width', None)
# 创建模拟数据
np.random.seed(42)
n_rows = 1000
dates = pd.date_range('2025-01-01', '2025-01-31', periods=n_rows)
df = pd.DataFrame({
'order_id': range(1, n_rows + 1),
'date': dates,
'product_category': np.random.choice(['电子产品', '服装', '食品', '家居', '美妆'], n_rows),
'product_name': np.random.choice(['手机', 'T恤', '零食', '沙发', '口红'], n_rows),
'quantity': np.random.randint(1, 5, n_rows),
'unit_price': np.random.normal(100, 50, n_rows).clip(10, 500),
'customer_age': np.random.randint(18, 60, n_rows),
'customer_city': np.random.choice(['北京', '上海', '广州', '深圳', '杭州'], n_rows),
'payment_method': np.random.choice(['支付宝', '微信支付', '银行卡'], n_rows)
})
# 计算订单总金额
df['total_amount'] = df['quantity'] * df['unit_price']
# 添加一些异常值
df.loc[0, 'total_amount'] = 50000 # 异常高价订单
df.loc[1, 'quantity'] = 0 # 数量为0的订单
# 显示数据前几行
print("数据概览:")
print(df.head())
print("\n数据形状:", df.shape)
print("\n数据类型:")
print(df.dtypes)
2. 数据清洗
# 检查缺失值
print("缺失值统计:")
print(df.isnull().sum())
# 处理异常订单
# 移除数量为0的订单
df = df[df['quantity'] > 0]
# 处理异常高价订单(假设超过5000元为异常)
print("\n异常高价订单数量:", (df['total_amount'] > 5000).sum())
# 移除异常高价订单(也可以选择保留并单独分析)
df = df[df['total_amount'] <= 5000]
# 添加时间维度列
df['weekday'] = df['date'].dt.day_name() # 星期几
df['day'] = df['date'].dt.day # 日期
print("\n清洗后数据形状:", df.shape)
print("\n清洗后数据统计:")
print(df[['quantity', 'unit_price', 'total_amount']].describe())
3. 可视化分析
图表1: 每日销售趋势
# 按日期汇总销售额
daily_sales = df.groupby('date')['total_amount'].sum().reset_index()
# 绘制销售趋势图
plt.figure(figsize=(14, 6))
plt.plot(daily_sales['date'], daily_sales['total_amount'],
linewidth=2, color='#3498db', marker='o', markersize=4)
# 添加趋势线
z = np.polyfit(range(len(daily_sales)), daily_sales['total_amount'], 1)
p = np.poly1d(z)
plt.plot(daily_sales['date'], p(range(len(daily_sales))),
"r--", alpha=0.8, linewidth=2, label='趋势线')
plt.title('2025年1月每日销售额趋势', fontsize=16, pad=20)
plt.xlabel('日期', fontsize=12)
plt.ylabel('销售额(元)', fontsize=12)
plt.legend()
plt.grid(True, linestyle='--', alpha=0.6)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
图表解读:
• 从趋势线可以看出,1月份整体销售额呈上升趋势
• 可能存在周末或节日的销售高峰
• 需要分析具体是哪些因素推动了增长
图表2: 各品类销售额对比
# 按品类汇总销售额和订单数
category_stats = df.groupby('product_category').agg({
'total_amount': 'sum',
'order_id': 'count',
'quantity': 'sum'
}).round(2)
category_stats.columns = ['总销售额', '订单数', '销售数量']
category_stats = category_stats.sort_values('总销售额', ascending=False)
print("各品类销售统计:")
print(category_stats)
# 绘制柱状图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 6))
# 左图:销售额
colors = ['#3498db', '#2ecc71', '#f39c12', '#e74c3c', '#9b59b6']
bars = ax1.bar(category_stats.index, category_stats['总销售额'], color=colors)
ax1.set_title('各品类销售额对比', fontsize=14, pad=15)
ax1.set_ylabel('销售额(元)', fontsize=12)
ax1.tick_params(axis='x', rotation=45)
# 在柱子上添加数值
for bar in bars:
height = bar.get_height()
ax1.text(bar.get_x() + bar.get_width()/2., height,
f'{height:,.0f}',
ha='center', va='bottom', fontsize=10)
# 右图:订单数
bars2 = ax2.bar(category_stats.index, category_stats['订单数'], color=colors)
ax2.set_title('各品类订单数对比', fontsize=14, pad=15)
ax2.set_ylabel('订单数', fontsize=12)
ax2.tick_params(axis='x', rotation=45)
for bar in bars2:
height = bar.get_height()
ax2.text(bar.get_x() + bar.get_width()/2., height,
f'{int(height)}',
ha='center', va='bottom', fontsize=10)
plt.tight_layout()
plt.show()
图表解读:
• 电子产品销售额最高,但订单数不一定最多,说明客单价高
• 服装类目虽然单价低,但订单数多,说明是高频消费品类
• 需要结合这两个指标综合评估品类表现
图表3: 用户年龄分布与消费能力
# 按年龄段分组
df['age_group'] = pd.cut(df['customer_age'],
bins=[0, 25, 35, 45, 60],
labels=['18-25岁', '26-35岁', '36-45岁', '46-60岁'])
# 按年龄段统计
age_stats = df.groupby('age_group').agg({
'total_amount': ['sum', 'mean', 'count']
}).round(2)
age_stats.columns = ['总消费额', '平均客单价', '订单数']
print("各年龄段消费统计:")
print(age_stats)
# 绘制年龄分布
fig, axes = plt.subplots(1, 3, figsize=(18, 6))
# 图1:年龄分布
age_counts = df['age_group'].value_counts().sort_index()
axes[0].pie(age_counts.values, labels=age_counts.index, autopct='%1.1f%%',
colors=colors)
axes[0].set_title('用户年龄分布', fontsize=14)
# 图2:各年龄段消费额
axes[1].bar(age_stats.index, age_stats['总消费额'], color=colors)
axes[1].set_title('各年龄段总消费额', fontsize=14)
axes[1].set_ylabel('消费额(元)')
axes[1].tick_params(axis='x', rotation=45)
# 图3:各年龄段客单价
axes[2].bar(age_stats.index, age_stats['平均客单价'], color=colors)
axes[2].set_title('各年龄段平均客单价', fontsize=14)
axes[2].set_ylabel('客单价(元)')
axes[2].tick_params(axis='x', rotation=45)
plt.tight_layout()
plt.show()
图表解读:
• 26-45岁年龄段是主要消费群体,订单数和消费额都最高
• 36-45岁群体客单价最高,说明消费能力强
• 18-25岁群体虽然消费额不高,但潜力大,可以作为重点培养对象
图表4: 城市销售热力图
# 按城市和品类统计销售
city_category_sales = df.groupby(['customer_city', 'product_category'])['total_amount'].sum().unstack()
print("城市-品类销售矩阵:")
print(city_category_sales)
# 绘制热力图
plt.figure(figsize=(12, 8))
sns.heatmap(city_category_sales, annot=True, fmt='.0f', cmap='YlOrRd',
linewidths=1, cbar_kws={'label': '销售额(元)'},
square=True)
plt.title('各城市-品类销售额热力图', fontsize=16, pad=20)
plt.xlabel('产品品类', fontsize=12)
plt.ylabel('城市', fontsize=12)
plt.tight_layout()
plt.show()
图表解读:
• 北京在电子产品品类表现突出
• 上海在服装品类占优势
• 广州在食品品类销售更好
• 不同城市消费偏好差异明显,可以针对性营销
图表5: 支付方式使用趋势
# 按支付方式和日期统计
payment_daily = df.groupby(['date', 'payment_method'])['order_id'].count().unstack()
# 计算支付方式占比
payment_total = df['payment_method'].value_counts()
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 6))
# 左图:支付方式占比
colors_payment = ['#1296db', '#7bb62a', '#e74c3c']
explode = (0.05, 0, 0) # 突出显示支付宝
ax1.pie(payment_total.values, labels=payment_total.index, autopct='%1.1f%%',
colors=colors_payment, explode=explode, startangle=90)
ax1.set_title('支付方式占比', fontsize=14)
# 右图:每日支付方式使用量
payment_daily.plot(kind='area', stacked=True, alpha=0.7, ax=ax2)
ax2.set_title('每日各支付方式使用量', fontsize=14)
ax2.set_xlabel('日期')
ax2.set_ylabel('订单数')
ax2.legend(title='支付方式', loc='upper left')
ax2.tick_params(axis='x', rotation=45)
plt.tight_layout()
plt.show()
图表解读:
• 支付宝是最主要的支付方式
• 微信支付紧随其后
• 银行卡支付占比较小,可能需要分析原因
• 各支付方式使用量相对稳定
4. 生成分析报告
# 计算关键指标
total_sales = df['total_amount'].sum()
total_orders = df['order_id'].nunique()
avg_order_value = df['total_amount'].mean()
avg_quantity = df['quantity'].mean()
top_category = category_stats.index[0]
top_city = df.groupby('customer_city')['total_amount'].sum().idxmax()
print("="*50)
print("2025年1月销售数据分析报告")
print("="*50)
print(f"\n整体指标:")
print(f"- 总销售额: ¥{total_sales:,.2f}")
print(f"- 总订单数: {total_orders}")
print(f"- 平均客单价: ¥{avg_order_value:.2f}")
print(f"- 平均购买数量: {avg_quantity:.1f}件")
print(f"\n品类表现:")
print(f"- 销量冠军品类: {top_category}")
print(f"- 该品类销售额: ¥{category_stats.loc[top_category, '总销售额']:,.2f}")
print(f"\n区域表现:")
print(f"- 销量冠军城市: {top_city}")
print(f"- 该城市销售额: ¥{df[df['customer_city']==top_city]['total_amount'].sum():,.2f}")
print(f"\n用户特征:")
print(f"- 主要消费年龄段: 26-45岁")
print(f"- 占比: {((df['customer_age']>=26) & (df['customer_age']<=45)).sum()/len(df)*100:.1f}%")
print("\n" + "="*50)
工具库推荐
除了三大核心库,这些库也值得了解:
专业图表库:
• Altair: 基于语法糖的声明式可视化库
• Bokeh: 专注于Web交互的可视化库
• Pyecharts: 百度Echarts的Python接口,适合中文环境
数据分析增强库:
• Plotnine: ggplot2风格的Python实现
• Missingno: 专门用于可视化缺失数据
• Yellowbrick: 机器学习可视化工具
实用工具
Jupyter扩展:
• jupyterlab: Jupyter的下一代界面
• ipywidgets: 交互式组件
• voila: 将Notebook转换为Web应用
报告生成工具:
• nbconvert: 导出Notebook为多种格式
• Papermill: 参数化执行Notebook
• Datapane: 自动化生成数据报告
实战建议
最后分享几个我总结的经验:
1. 先理解数据,再选择图表: 不要为了用某个图表而用,要根据数据特征和分 析目的来选择
2. 代码复用很重要: 把常用的可视化代码封装成函数,提高效率
3. 配色要统一: 建立自己的配色方案,保持风格一致
4. 交互图表适量用: 交互式图表虽然酷,但静态图表有时候更清晰
5. 持续学习新工具: 可视化领域发展很快,定期关注新的工具和技术
我的学习路径建议:
6. 先掌握Matplotlib基础(1-2周)
7. 学习Seaborn统计可视化(1周)
8. 掌握Plotly交互式图表(1周)
9. 学习Jupyter报告生成(1周)
10. 做实战项目,综合运用(持续)
大概需要1-2个月就能入门,但要精通需要大量实践。
相关代码:
本教程所有代码示例已经过测试,可以直接在Jupyter Notebook中运行。
有问题吗?
欢迎在评论区讨论,我会尽力回复每一条留言。
更多推荐


所有评论(0)