优化策略
- 颜色搭配
- 使用色彩主题:选择符合项目风格和受众的色彩主题。例如,对于专业报告可使用柔和、协调的配色方案;对于面向大众的展示可使用更鲜明、对比强烈的色彩。像
seaborn
库提供了多种色彩主题,如deep
、muted
、bright
、pastel
、dark
、colorblind
等。
- 区分数据系列:为不同的数据系列分配不同颜色,且颜色要有足够的对比度以便区分。避免使用相近颜色,如浅蓝和深蓝在某些情况下不易区分。同时,确保颜色的选择对色盲友好,例如使用色盲友好的调色板,像
seaborn.color_palette("colorblind")
。
- 保持一致性:在整个图形以及相关图形中,对相同类型的数据使用相同颜色。比如,在多个子图中,代表销售额的数据系列始终使用红色。
- 样式选择
- 线条样式:对于线条图,不同数据系列可使用不同线条样式(如实线、虚线、点线等)。例如,在一个包含预测值和实际值的线条图中,实际值用实线,预测值用虚线,这样能直观区分不同性质的数据。
- 标记样式:在线条图或散点图中,不同数据系列使用不同标记样式(如圆形、方形、三角形等)。当线条颜色区分度不够时,标记样式能进一步辅助区分数据。
- 图表类型:根据数据特点和展示目的选择合适图表类型。如展示数据随时间变化趋势用线条图;展示各部分占比关系用饼图或环形图;展示两个变量关系用散点图等。对于复杂数据,可能需要组合多种图表类型。
- 视觉层次
- 突出重要信息:将关键数据系列用更大尺寸、更鲜艳颜色或更粗线条突出显示。例如,在展示多个产品销售额的组合图中,重点产品销售额用较粗线条或不同颜色填充强调。
- 弱化次要信息:次要数据系列使用较淡颜色、较细线条或较小尺寸。比如,在组合图中辅助数据系列用灰色细线条展示。
- 合理布局:合理安排子图位置和大小,重要子图放在显著位置(如左上角)。子图之间保持适当间距,避免拥挤。同时,合理安排图例、坐标轴标签等元素位置,避免遮挡数据。
Bokeh实现关键代码片段
from bokeh.plotting import figure, show, output_notebook
from bokeh.models import ColumnDataSource, Legend
from bokeh.transform import factor_cmap
from bokeh.palettes import Category10
output_notebook()
# 示例数据
data = {
'products': ['Product A', 'Product B', 'Product C'],
'sales_2020': [100, 150, 120],
'sales_2021': [120, 180, 130]
}
source = ColumnDataSource(data)
p = figure(x_range=data['products'], title='Product Sales Comparison',
toolbar_location=None, tools='')
# 颜色搭配
p.vbar(x='products', top='sales_2020', width=0.9, source=source,
line_color='white', fill_color=factor_cmap('products', palette=Category10[3], factors=data['products']),
legend_label='2020 Sales')
p.vbar(x='products', top='sales_2021', width=0.9, source=source,
line_color='white', fill_color=factor_cmap('products', palette=Category10[3], factors=data['products'], start=3),
legend_label='2021 Sales')
# 样式选择
p.xaxis.major_label_orientation = 1.2
p.xgrid.grid_line_color = None
p.ygrid.grid_line_color = 'gray'
p.ygrid.grid_line_alpha = 0.5
# 视觉层次
legend = Legend(items=[
('2020 Sales', [p.renderers[0]]),
('2021 Sales', [p.renderers[1]])
], location=(0, -30))
p.add_layout(legend, 'below')
show(p)
Altair实现关键代码片段
import altair as alt
import pandas as pd
# 示例数据
data = pd.DataFrame({
'products': ['Product A', 'Product B', 'Product C'],
'sales_2020': [100, 150, 120],
'sales_2021': [120, 180, 130]
})
# 颜色搭配
bar_2020 = alt.Chart(data).mark_bar().encode(
x='products:N',
y='sales_2020:Q',
color=alt.Color('products:N', scale=alt.Scale(scheme='category10'))
).properties(
title='Product Sales Comparison'
)
bar_2021 = alt.Chart(data).mark_bar().encode(
x='products:N',
y='sales_2021:Q',
color=alt.Color('products:N', scale=alt.Scale(scheme='category10', range=['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf']))
)
# 样式选择
base = alt.Chart(data).encode(
x='products:N'
).properties(
width=300,
height=300
)
# 视觉层次
combined = alt.layer(bar_2020, bar_2021).resolve_scale(
color='independent'
)
show(combined)