MST

星途 面试题库

面试题:Python数据可视化中如何优化复杂图形的颜色和样式以提高可读性

在Python进行数据可视化时,遇到一个具有多维度、多层次数据的复杂图形(例如包含多个子图、多种数据系列的组合图),为了提高其可读性,从颜色搭配、样式选择、视觉层次等方面,阐述一套完整的优化策略,并给出使用至少两种不同数据可视化库(如Bokeh和Altair)实现该策略的关键代码片段。
34.8万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

优化策略

  1. 颜色搭配
    • 使用色彩主题:选择符合项目风格和受众的色彩主题。例如,对于专业报告可使用柔和、协调的配色方案;对于面向大众的展示可使用更鲜明、对比强烈的色彩。像seaborn库提供了多种色彩主题,如deepmutedbrightpasteldarkcolorblind等。
    • 区分数据系列:为不同的数据系列分配不同颜色,且颜色要有足够的对比度以便区分。避免使用相近颜色,如浅蓝和深蓝在某些情况下不易区分。同时,确保颜色的选择对色盲友好,例如使用色盲友好的调色板,像seaborn.color_palette("colorblind")
    • 保持一致性:在整个图形以及相关图形中,对相同类型的数据使用相同颜色。比如,在多个子图中,代表销售额的数据系列始终使用红色。
  2. 样式选择
    • 线条样式:对于线条图,不同数据系列可使用不同线条样式(如实线、虚线、点线等)。例如,在一个包含预测值和实际值的线条图中,实际值用实线,预测值用虚线,这样能直观区分不同性质的数据。
    • 标记样式:在线条图或散点图中,不同数据系列使用不同标记样式(如圆形、方形、三角形等)。当线条颜色区分度不够时,标记样式能进一步辅助区分数据。
    • 图表类型:根据数据特点和展示目的选择合适图表类型。如展示数据随时间变化趋势用线条图;展示各部分占比关系用饼图或环形图;展示两个变量关系用散点图等。对于复杂数据,可能需要组合多种图表类型。
  3. 视觉层次
    • 突出重要信息:将关键数据系列用更大尺寸、更鲜艳颜色或更粗线条突出显示。例如,在展示多个产品销售额的组合图中,重点产品销售额用较粗线条或不同颜色填充强调。
    • 弱化次要信息:次要数据系列使用较淡颜色、较细线条或较小尺寸。比如,在组合图中辅助数据系列用灰色细线条展示。
    • 合理布局:合理安排子图位置和大小,重要子图放在显著位置(如左上角)。子图之间保持适当间距,避免拥挤。同时,合理安排图例、坐标轴标签等元素位置,避免遮挡数据。

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)