news 2026/2/9 18:03:28

如何为色盲人士创建可访问的图表

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何为色盲人士创建可访问的图表

原文:towardsdatascience.com/how-to-create-accessible-graphs-for-colorblind-people-295e517c9b15

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/5ee134235b43177c165597573f5501ff.png

作者使用 Midjourney 创建的图像。

色盲,或更准确地说,色觉缺陷,影响多达 8%的男性和 0.5%的女性。最常见的情况是红绿色盲,这是一种先天性失调,其中人们在视网膜上缺乏对红色或绿色的感受器。因此,他们无法区分红色和绿色、青色和灰色、蓝色和紫色等颜色对。

对于数据科学家来说,在选择图表的颜色方案时考虑色盲用户是很重要的。相当一部分用户将会有某种形式的色觉缺陷,他们可能对图表的理解与预期不同。事实上,当我直接主管无法阅读我的折线图时,我意识到了这一点,结果是他难以区分红色和绿色。

在这篇文章中,我将分享

  • 用于最常见的色盲形式的 Python 模拟器

  • matplotlib 和 seaborn 默认颜色方案的可用性测试

  • 使用 ColorBrewer 创建可访问的颜色方案

色盲是什么样的?

色觉是由视网膜中的锥状细胞实现的。有三种不同类型的锥状细胞分别接收红光、绿光和蓝光。红绿色盲的人缺乏检测红光或绿光的锥状细胞。两种锥状细胞都缺乏,只剩下蓝光感受器的情况很少见,同样缺乏蓝光感受器和全色盲,即所有色觉感受器的缺失也很少见。

对于能够看到所有颜色的人来说,很难想象色盲人士看到的图表是什么样的。色盲模拟器是检查你的图形可访问性的有用工具。以下面板中的模拟是通过DaltonLens 在线色盲模拟器制作的,使用了Brettel算法。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/1d9d3f3beba9d9f026236139c846c429.png

原图由作者使用 Midjourney 生成。通过 Dalton 镜片进行色盲模拟的变体。daltonlens.org/colorblindness-simulator


Python 模拟器

DaltonLens 项目提供了模拟色觉缺陷的几个算法的实现。源代码可在 Github 上找到,并且可以使用以下命令安装库本身:

pip install daltonlens

我们使用 Python 图像库(PIL)和一个由两条线组成的图表组成的测试图像。测试图像由以下代码行生成并保存为 png 图像文件。

frommatplotlibimportpyplotaspltimportnumpyasnp# Create a test image featuring two line plotsfig,ax=plt.subplots(1,1)ax.plot(x,y1,label='data 1',color='red')ax.plot(x,y2,label='data 2',color='green')ax.set_xlabel('x')ax.set_ylabel('y')ax.legend()plt.savefig('./plots/2024-dalton-lines.jpg',bbox_inches='tight')

然后,我们加载测试图像,色盲模拟器将 RGB 值转换,以便转换后的图像与色觉缺陷的人的感知相似。

fromdaltonlensimportconvert,simulate,generateimportPIL# Load the original image and convert it to a numpy arrayim=np.asarray(PIL.Image.open('./plots/2024-dalton-lines.jpg').convert('RGB'))# Create a simulator using the Brettel 1997 algorithm.simulator=simulate.Simulator_Brettel1997()# Apply the simulator to the input image to get a simulation of deutan anomaly ("green-blindness")greenblind_im=simulator.simulate_cvd(im,simulate.Deficiency.DEUTAN,severity=1.0)# Create an image from the transformed arrayim2=PIL.Image.fromarray(protan_im)

两个图像并排比较显示,模拟绿色盲版本(中间和右侧)中左侧的红色和绿色线条几乎看不见。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/9a1d3fea776b0765dd151e272ea03088.png

使用 daltonlens 软件包模拟绿色色觉缺陷的图表。图像由作者创建。

daltonlens库包含不同类型色觉缺陷的模拟器。可以通过传递simulate.Deficiency.{DEUTAN, TRITAN, PROTAN}的实例到模拟器中来改变它们。

  • DEUTAN对应绿色盲(约 6% 的男性和 0.39% 的女性人口)。

  • PROTAN对应红色盲(约 2% 的男性和 0.04% 的女性人口)。

  • TRITAN对应蓝色盲(非常罕见,受影响比例不到 0.002%)。

此外,可以选择不同的算法,尽管他们的网站上推荐 Bretter 和 Viennot 算法。

色盲模拟是如何工作的?

在底层,算法执行矩阵变换。一个 RGB 图像可以表示为一个数组,其中每个像素对应一个包含红色、绿色和蓝色值的数组。

这个 RGB 像素数组被转换成一个表示,其中视网膜上的三种锥体(L、M 和 S)形成坐标系。在这个表示中,像素值根据缺陷的锥体和色觉缺陷的严重程度进行转换。

最后,数组被转换回 RGB,以便可以在显示器上正确显示。


默认颜色方案的可访问性如何?

Python 的默认绘图库是 matplotlib。线图的默认颜色方案由八种颜色组成。以下图显示了所有八种颜色的线图。当我们模拟绿色盲的人看到这个图表的样子时,我们看到颜色仍然可以区分,尽管它们看起来比原始图表更接近。例如,蓝色和紫色(C0 和 C4)几乎无法区分。红色、绿色和棕色(C2、C3、C5)也是如此。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/c5e2337a4942e514348dd454a0529b29.png

默认 matplotlib 颜色周期的八种颜色。左:原始颜色。右:模拟绿色盲。图像由作者创建。

在这种情况下,一个可访问的图表会使用线型(虚线、点线和实线)。此外,我不会在图表中使用过多的线条,因为这会使图表变得杂乱。

使用热图显示二维数据。以下代码生成样本数据,并使用在红色、黄色和绿色之间变化的颜色图。然后对其进行处理以模拟绿色盲。我们使用严重程度参数来改变颜色视觉缺失的程度,在这种情况下为 75%到 100%。

# create an example figurefig,ax=plt.subplots(1,1)xx,yy=np.meshgrid(np.linspace(0,2*np.pi,40),np.linspace(0,2*np.pi,40))zz=np.cos(xx)+np.sin(yy)img=ax.imshow(zz,cmap='RdYlGn')plt.colorbar(img)ax.set_xlabel('x')ax.set_ylabel('y')fig.tight_layout()plt.savefig('./plots/2024-dalton-mpl-heat-rdylgn.jpg')# simulate 75% green-blindnessim=np.asarray(PIL.Image.open('./plots/2024-dalton-mpl-heat-rdylgn.jpg').convert('RGB'))simulator=simulate.Simulator_Brettel1997()greenblind_im=simulator.simulate_cvd(im,simulate.Deficiency.DEUTAN,severity=0.75)im2=PIL.Image.fromarray(greenblind_im)im2# simulate full green-blindnessim=np.asarray(PIL.Image.open('./plots/2024-dalton-mpl-heat-rdylgn.jpg').convert('RGB'))simulator=simulate.Simulator_Brettel1997()greenblind_im=simulator.simulate_cvd(im,simulate.Deficiency.DEUTAN,severity=1.0)im3=PIL.Image.fromarray(greenblind_im)im3

结果图显示,这种颜色图对色盲人士来说是一个糟糕的选择。正负值出现在相同的色调中。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/5ac7aa283870937561b8454626d5e313.png

模拟的 2D 热图颜色视觉缺失。图像由作者创建。

幸运的是,有一些颜色调色板更适合色盲人士。下一面板显示了一个使用 viridis 颜色图的 heatmap,颜色从黄色循环到蓝色。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/15489f8f14b73b222c3e542c0b0b41f0.png

模拟 viridis 调色板颜色视觉缺失。图像由作者创建。

统计图表,如条形图,通常使用颜色来提高可读性。我们使用 seaborn 绘图库和默认颜色调色板来创建玩具数据的条形图。

# create example bar plotimportpandasaspdimportseabornassns fig,ax=plt.subplots(1,1)x=['A','B','C','D','E','F','G','H']y=np.random.rand(len(x))data=pd.DataFrame(dict(x=x,y=y))# plot with seabornsns.barplot(data=data,x=x,y=y)ax.set_xlabel('Category')ax.set_ylabel('Value')fig.tight_layout()plt.savefig('./plots/2024-dalton-bar.jpg')# simulate green-blindnessim=np.asarray(PIL.Image.open('./plots/2024-dalton-bar.jpg').convert('RGB'))simulator=simulate.Simulator_Brettel1997()greenblind_im=simulator.simulate_cvd(im,simulate.Deficiency.DEUTAN,severity=1.0)im2=PIL.Image.fromarray(greenblind_im)im2

结果条形图显示在 seaborn 的默认颜色调色板中,与 matplotlib 相同。我发现颜色类别 C、D、F(绿色、红色和棕色)在右侧的色盲版本中非常接近。在这种情况下,颜色对图表的贡献不大,我建议所有条形都使用相同的颜色。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/66133c41a585f639a93c5fbb2f66c6f1.png

Seaborn 条形图。图像由作者创建。


ColorBrewer 调色板

当我想创建自己的颜色调色板而不依赖于 matplotlib 和 seaborn 中可用的默认调色板时,我通常会转向ColorBrewer网站。尽管该网站最初是为地图数据创建的,但它有一个方便的功能,用于创建色盲友好型调色板。

用户可以创建最多 12 种不同颜色的颜色调色板。生成的调色板可以导出为十六进制颜色,用于 matplotlib 等绘图工具。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/13d29aac28beed582b05d169026e58fb.png

ColorBrewer 网站的截图。由作者创建。


摘要

色觉缺失很常见。大约有 8%的人受到一定程度的影响,其中绿色盲和红色盲是最常见的类型。图表通过颜色传达其意义,例如,在图表中显示多条线,以及展示 2D 热图。

色盲模拟器是测试图表可访问性的有用工具。它们可以直接导入到 Python 代码中,以便在任何项目中快速使用。

在选择颜色和调色板时,进行色盲检查有助于提高你图表的可访问性,并确保它们能够传达信息给任何用户。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/892ed10150fac0946af80c0b006c2072.png

作者使用 Midjourney 创建的图像。

参考文献

  • 开源色盲模拟器综述:daltonlens.org/opensource-cvd-simulation/

  • 色盲模拟器:daltonlens.org/colorblindness-simulator

  • ColorBrewer:colorbrewer2.org/

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/9 14:34:28

全自研仿真GPU求解器x虚实对标物理测量工厂,打造具身合成数据SuperApp,加速具身仿真生态丨光轮智能@MEET2026

编辑部 整理自 MEET2026量子位 | 公众号 QbitAI从大模型智能的“语言世界”迈向具身智能的“物理世界”,仿真正在成为连接落地的底层基础设施。在本次量子位MEET2026智能未来大会上,光轮智能联合创始人兼总裁杨海波给出了他的观察:具身智能的…

作者头像 李华
网站建设 2026/2/9 14:34:26

达梦数据库备份还原

目录 一、 核心架构:达梦备份还原全景图 二、 基石配置:开启归档模式全流程 2.1 归档模式的重要性 2.2 开启归档实战步骤 三、 备份实战:多种场景详细操作 3.1 联机全量备份(生产环境首选) 3.2 增量备份策略 3.…

作者头像 李华
网站建设 2026/2/9 11:03:06

如何在数据科学职位申请中创造机会并获得成功

原文:towardsdatascience.com/how-to-create-opportunities-and-succeed-in-data-science-job-applications-3881a5c86508?sourcecollection_archive---------7-----------------------#2024-10-29 我从成功与失败中汲取的宝贵经验,将帮助你在职业道路上…

作者头像 李华
网站建设 2026/2/9 11:03:04

LangFlow条件判断节点使用方法:实现智能路由逻辑

LangFlow条件判断节点使用方法:实现智能路由逻辑 在构建大语言模型(LLM)驱动的应用时,一个常见的挑战是:如何让系统“听懂”用户的意图,并据此做出不同响应?比如,用户问的是退货政策…

作者头像 李华
网站建设 2026/2/9 11:03:02

ModbusTCP报文格式说明:图解入门与实例演示

深入理解 Modbus TCP 报文结构:从零开始的实战解析 在工业自动化和物联网系统中,设备之间的通信是系统的“神经系统”。而在这条神经网络中, Modbus TCP 是最常见、最可靠的一种协议之一。它简洁、开放、易于实现,被广泛应用于 …

作者头像 李华