本文目录导读:
- 核心工具库
- 案例一:使用Seaborn实现“开箱即美”
- 案例二:Matplotlib自定义主题(仿Nature/Science论文风格)
- 案例三:使用Matplotlib自定义样式(“极简+高级感”)
- 案例四:Plotly交互式图表(Web展示)
- 案例五:热力图美化(用于相关性矩阵或混淆矩阵)
- 根据需求选择
Python图表美化的案例非常丰富,涵盖了从简单的样式调整到复杂的自定义主题,下面我将按照工具库和应用场景来分类,介绍一些经典且有代表性的美化案例。
核心工具库
- Matplotlib:基础库,功能强大但默认样式较丑,美化主要体现在参数调整和主题使用。
- Seaborn:基于Matplotlib,自带美观主题和统计图表,是快速美化的首选。
- Plotly:交互式图表,非常适合Web展示。
- 其他:
proplot(科学论文风格)、prettyplotlib、scienceplots等专业美化库。
使用Seaborn实现“开箱即美”
这是最简单、最通用的美化方式,Seaborn的默认主题就比Matplotlib好很多。
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 准备数据
tips = sns.load_dataset('tips')
# 设置主题和样式
sns.set_theme(style='whitegrid', palette='muted', font_scale=1.2)
# 绘制箱线图
plt.figure(figsize=(8, 5))
sns.boxplot(x='day', y='total_bill', hue='sex', data=tips, palette='Set2')
和轴标签,使用英文避免中文问题'Total Bill by Day and Gender')
plt.xlabel('Day of Week')
plt.ylabel('Total Bill (USD)')
# 自动调整布局并显示
plt.tight_layout()
# 去掉图例边框等微调
sns.despine(left=True, bottom=False)
plt.show()
美化效果:背景为浅灰网格,坐标轴无上边和右边边框(despine),颜色柔和(Set2),字体变大。
Matplotlib自定义主题(仿Nature/Science论文风格)
用于学术论文的图表,需要干净、清晰、字体标准。
import matplotlib.pyplot as plt
import numpy as np
# 使用 scienceplots 库 (需要安装: pip install SciencePlots)
# 这是专门为学术论文设计的主题库
import scienceplots
# 设置风格为 IEEE 或 Nature 风格
plt.style.use(['science', 'ieee']) # 或者 ['science', 'nature']
# 生成数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
fig, ax = plt.subplots(figsize=(4, 3)) # 小尺寸适合论文单栏
# 绘制线条,使用不同线型和标记
ax.plot(x, y1, label='sin(x)', color='#D32F2F', linewidth=1.5, linestyle='-')
ax.plot(x, y2, label='cos(x)', color='#1976D2', linewidth=1.5, linestyle='--')
# 标签
ax.set_xlabel('Time (s)')
ax.set_ylabel('Amplitude')
ax.set_title('Sine and Cosine Waves')
# 图例放在内部
ax.legend(loc='upper right', frameon=False) # 去掉图例边框
# 设置刻度向内
ax.tick_params(direction='in', length=4)
# 显示网格 (可选)
# ax.grid(True, linestyle=':', alpha=0.6)
plt.tight_layout()
plt.show()
美化效果:去掉了顶部和右侧边框,坐标轴刻度向内,字体为Times New Roman或类似风格,线条粗细适中,色彩为学术常用色,整体干净整洁。
使用Matplotlib自定义样式(“极简+高级感”)
适合商业汇报或数据博客,强调视觉清晰度和高级感。
import matplotlib.pyplot as plt
import numpy as np
# 自定义一个函数来创建“暗黑”或“极简”主题
def set_dark_style():
plt.rcParams.update({
# 背景色
'axes.facecolor': '#2E2E2E',
'figure.facecolor': '#2E2E2E',
# 坐标轴颜色
'axes.edgecolor': '#D3D3D3',
'axes.labelcolor': '#D3D3D3',
'xtick.color': '#D3D3D3',
'ytick.color': '#D3D3D3',
# 文本颜色
'text.color': '#D3D3D3',
# 网格样式
'grid.color': '#444444',
'grid.linestyle': '--',
'grid.alpha': 0.5,
# 字体
'font.family': 'sans-serif',
'font.size': 10,
})
# 应用自定义风格
set_dark_style()
# 生成数据
np.random.seed(42)
x = np.arange(1, 11)
y = np.random.randint(20, 60, size=10)
fig, ax = plt.subplots(figsize=(8, 5))
# 绘制柱状图,使用渐变色
colors = plt.cm.viridis(np.linspace(0.2, 0.8, 10))
ax.bar(x, y, color=colors, edgecolor='white', linewidth=1.5, width=0.7)
# 添加数据标签
for i, v in enumerate(y):
ax.text(i+1, v + 1, str(v), ha='center', va='bottom', fontsize=9, color='#D3D3D3')
ax.set_xlabel('Category')
ax.set_ylabel('Value')
ax.set_title('Custom Dark Theme Bar Chart')
# 显示网格 (只在Y轴)
ax.grid(axis='y', alpha=0.4)
ax.set_axisbelow(True) # 让网格在柱状图下方
plt.tight_layout()
plt.show()
美化效果:暗色背景、亮色数据、渐变色彩、坐标轴标签为浅色,整体具有高级科技感,适合演示环境。
Plotly交互式图表(Web展示)
适合需要用户探索数据、鼠标悬停显示详情、缩放等场景。
import plotly.express as px
import pandas as pd
# 加载内置数据集
df = px.data.gapminder()
# 筛选2007年的数据
df_2007 = df[df['year'] == 2007]
# 创建气泡图
fig = px.scatter(
df_2007,
x='gdpPercap', # X轴:人均GDP
y='lifeExp', # Y轴:预期寿命
size='pop', # 气泡大小:人口
color='continent', # 颜色:大洲
hover_name='country', # 悬停显示国家名
log_x=True, # X轴对数刻度
size_max=60, # 最大气泡大小'2007年世界人口、人均GDP与预期寿命',
template='plotly_dark' # 内置暗黑主题
)
# 优化布局
fig.update_layout(
xaxis_title='人均GDP (美元)',
yaxis_title='预期寿命 (岁)',
legend_title_text='大洲',
font=dict(family='Arial, sans-serif', size=12)
)
# 显示图表 (在Jupyter Notebook中自动显示,或生成HTML文件)
# fig.show()
# fig.write_html("my_interactive_chart.html")
美化效果:交互式,鼠标悬停显示详细信息,明亮的色彩区分大洲,整体布局现代化,Plotly的默认主题已经非常美观(如plotly、plotly_dark、ggplot2等)。
热力图美化(用于相关性矩阵或混淆矩阵)
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 生成相关性数据
np.random.seed(42)
data = np.random.randn(100, 6)
df = pd.DataFrame(data, columns=['Feature A', 'Feature B', 'Feature C',
'Feature D', 'Feature E', 'Feature F'])
corr = df.corr()
# 绘制热力图
plt.figure(figsize=(8, 6))
sns.heatmap(
corr,
annot=True, # 显示数值
fmt='.2f', # 数值格式
cmap='coolwarm', # 颜色映射 (红-白-蓝)
linewidths=0.5, # 单元格之间的线宽
linecolor='white', # 线颜色
cbar_kws={'label': '相关系数', 'shrink': 0.8}, # 颜色条设置
vmin=-1, vmax=1, # 色标范围
square=True, # 正方形单元格
mask=np.triu(np.ones_like(corr, dtype=bool)) # 只显示下三角 (可选)
)
'特征相关性热力图', fontsize=14)
plt.xticks(rotation=45, ha='right')
plt.yticks(rotation=0)
plt.tight_layout()
plt.show()
美化效果:使用coolwarm冷暖色直观表示正负相关,显示数值,方框分隔清晰,只显示一半矩阵避免冗余。
根据需求选择
| 场景 | 推荐工具/方法 | 特点 |
|---|---|---|
| 快速出图、EDA | Seaborn (sns.set_theme()) |
一行代码获得美观主题,适合探索性分析。 |
| 学术论文发表 | SciencePlots (plt.style.use('science')) |
符合期刊要求,干净、无多余元素。 |
| 商业汇报、Dashboard | Plotly (交互式) 或 Matplotlib自定义主题 | 交互式适合Web;静态的暗黑/极简风格适合PPT。 |
| 数据报告(静态) | Matplotlib + Seaborn 结合 | 利用Matplotlib的灵活性和Seaborn的美观主题。 |
| 特定图表美化 | 热力图、堆叠图、凸包图、小提琴图等 | 使用cmap、alpha、edgecolor等参数精细调整。 |
核心建议:
- 不要从零开始:优先使用
scienceplots、seaborn或plotly的默认主题。 - 颜色调色板:使用
sns.color_palette('husl', 8)或plt.cm.viridis等专业调色板,避免使用默认的红色、蓝色、绿色组合。 - 字体和字号:选择无衬线字体(如Arial, Helvetica),字号要足够大,标题、轴标签、刻度要有明显层次。
- 去除冗余:默认情况下,很多边框、网格、图例边框、spine(坐标轴脊线)都是多余的,大胆去掉。
- 保存时使用高DPI:
plt.savefig('myfig.png', dpi=300, bbox_inches='tight')。
案例涵盖了从基础到进阶的常见美化场景,你可以直接复制代码进行修改和尝试。
标签: Matplotlib Seaborn