如何使用 Plotly Graph Objects 和 Plotly Express 定义图形中的颜色

2025-02-28 08:22:00
admin
原创
92
摘要:问题描述:有很多问题和答案都以某种方式涉及这个主题。通过这篇文章,我想清楚地说明为什么像 这样的简单方法对marker = {'color' : 'red'}有效plotly.graph_objects (go),但color='red'对 无效,尽管颜色是和plotly.express (px)的属性。我想...

问题描述:

有很多问题和答案都以某种方式涉及这个主题。通过这篇文章,我想清楚地说明为什么像 这样的简单方法marker = {'color' : 'red'}有效plotly.graph_objects (go),但color='red'对 无效,尽管颜色是和plotly.express (px)的属性。我想说明为什么它不起作用真是太棒了。px.Line`px.Scatter`


因此,如果px这是制作 plotly 图形的最简单方法,那么为什么像color='red'返回错误这样明显的事情

ValueError:“color”的值不是“data_frame”中列的名称。

简而言之,这是因为colorpx不接受任意的颜色名称或代码,而是接受数据集中的变量名称,以便为唯一值分配颜色循环并将它们显示为具有不同颜色的线条。

让我通过应用gapminderLife expectancy数据集来演示,并展示截至的全球GDP per capita所有(至少大多数)国家/地区的散点图2007。如下所示的基本设置将生成以下图表

图 1,使用以下绘图go

在此处输入图片描述

颜色由名为plotly的循环设置,但这里使用以下方法指定 marker = {'color' : 'red'}

图2,代码:

import plotly.graph_objects as go

df = px.data.gapminder()
df=df.query("year==2007")

fig = go.Figure()
fig.add_traces(go.Scatter(x=df['gdpPercap'], y=df["lifeExp"],
                          mode = 'markers',
                          marker = {'color' : 'red'}
                         ))
fig.show()

因此,让我们尝试一下px,并假设color='red'可以达到目的:

代码 2,尝试使用以下方法绘制具有定义颜色的散点图px

# imports
import plotly.express as px
import pandas as pd

# dataframe
df = px.data.gapminder()
df=df.query("year==2007")

# plotly express scatter plot
px.scatter(df, x="gdpPercap", y="lifeExp",
           color = 'red',
          )

结果:

ValueError:'color' 的值不是 'data_frame' 中列的名称。预期为 ['country', 'continent', 'year', 'lifeExp', 'pop', 'gdpPercap', 'iso_alpha', 'iso_num'] 之一,但收到:red

那么这里发生了什么?


解决方案 1:

首先,如果需要解释gopx之间的更广泛差异,请查看这里和这里。如果完全不需要解释,您会在答案的最后找到一个完整的代码片段,它将揭示 plotly.express 中许多带有颜色的幂


第一部分:本质:

乍一看可能并非如此,但有充分的理由说明color='red'为什么 无法按预期使用px。但首先,如果您想要做的只是手动为所有标记设置特定颜色,您可以使用.update_traces(marker=dict(color='red'))Python的链接方法来实现。但首先,让我们看看默认设置:

1.1 Plotly 表达默认值

图1,px默认散点图使用px.Scatter

在此处输入图片描述

代码1、px默认散点图使用px.Scatter

# imports
import plotly.express as px
import pandas as pd

# dataframe
df = px.data.gapminder()
df=df.query("year==2007")

# plotly express scatter plot
px.scatter(df, x="gdpPercap", y="lifeExp")

这里,正如问题中已经提到的,颜色被设置为可通过以下方式获得的默认 plotly 序列中的第一个颜色px.colors.qualitative.Plotly

['#636EFA', # the plotly blue you can see above
 '#EF553B',
 '#00CC96',
 '#AB63FA',
 '#FFA15A',
 '#19D3F3',
 '#FF6692',
 '#B6E880',
 '#FF97FF',
 '#FECB52']

这看起来很不错。但是如果你想改变一些东西,甚至同时添加更多信息,该怎么办?

1.2:如何覆盖默认值并使用 px 颜色准确执行您想要的操作:

正如我们在 中提到的px.scatter,该color属性不接受颜色red作为参数。相反,例如,您可以使用它color='continent'来轻松区分数据集中的不同变量。但是 中的颜色还有更多px


以下六种方法的组合将让您使用 plotly express精确地处理颜色。请记住,您甚至不必选择。您可以同时使用以下方法中的一种一些全部1。一种特别有用的方法将显示为和的组合3。但我们稍后会讲到这一点。这是您需要知道的:

1. 使用以下命令更改 px 使用的颜色序列:

color_discrete_sequence=px.colors.qualitative.Alphabet

2. 使用 color 参数为不同的变量分配不同的颜色

color = 'continent'

3. 使用以下颜色自定义一种或多种可变颜色

color_discrete_map={"Asia": 'red'}

4. 使用字典理解轻松对较大的变量子集进行分组,color_discrete_map

subset = {"Asia", "Africa", "Oceania"}
group_color = {i: 'red' for i in subset}

5. 使用颜色代码设置不透明度rgba()

color_discrete_map={"Asia": 'rgba(255,0,0,0.4)'}

6. 使用以下命令覆盖所有设置:

.update_traces(marker=dict(color='red'))

第二部分:细节和情节

以下代码片段将生成以下图表,显示各大洲不同 GDP 水平的预期寿命。标记的大小代表不同的人口水平,从一开始就让事情变得更有趣。

图 2:

在此处输入图片描述

代码2:

import plotly.express as px
import pandas as pd

# dataframe, input
df = px.data.gapminder()
df=df.query("year==2007")

px.scatter(df, x="gdpPercap", y="lifeExp",
           color = 'continent',
           size='pop',
          )

为了说明上述方法的灵活性,我们首先改变颜色顺序。由于我们首先只显示一个类别和一种颜色,因此您必须等待后续步骤才能看到实际效果。但现在这是color_discrete_sequence=px.colors.qualitative.Alphabet按照步骤 1 绘制的相同图:

1. 使用 px 更改颜色序列

color_discrete_sequence=px.colors.qualitative.Alphabet

在此处输入图片描述

现在,让我们将颜色序列中的颜色应用Alphabet到不同的大陆:

2. 使用 color 参数为不同的变量分配不同的颜色

color = 'continent'

在此处输入图片描述

如果您和我一样,认为这种特定的颜色序列看起来很舒服但可能有点难以区分,那么您可以将您选择的颜色分配给一个或多个大陆,如下所示:

3. 使用以下颜色自定义一种或多种可变颜色

color_discrete_map={"Asia": 'red'}

在此处输入图片描述

这真是太棒了:现在您可以更改序列并为特别有趣的变量选择任何您想要的颜色。但是如果您想为更大的子集分配特定颜色,上述方法可能会有点乏味。因此,您也可以使用字典理解来做到这一点:

4.使用字典理解将颜色分配给一个组并color_discrete_map

# imports
import plotly.express as px
import pandas as pd

# dataframe
df = px.data.gapminder()
df=df.query("year==2007")

subset = {"Asia", "Europe", "Oceania"}
group_color = {i: 'red' for i in subset}

# plotly express scatter plot
px.scatter(df, x="gdpPercap", y="lifeExp",
           size='pop',
           color='continent',
           color_discrete_sequence=px.colors.qualitative.Alphabet,
           color_discrete_map=group_color
          )

在此处输入图片描述

5.使用颜色代码设置不透明度rgba()

现在让我们退一步。如果你认为red这很适合亚洲,但可能有点太强烈,你可以使用rgba颜色调整不透明度,如下所示'rgba(255,0,0,0.4)'

在此处输入图片描述

最后一个图的完整代码:

import plotly.express as px
import pandas as pd

# dataframe, input
df = px.data.gapminder()
df=df.query("year==2007")

px.scatter(df, x="gdpPercap", y="lifeExp",
           color_discrete_sequence=px.colors.qualitative.Alphabet,
           color = 'continent',
           size='pop',
           color_discrete_map={"Asia": 'rgba(255,0,0,0.4)'}
          )

如果你觉得我们现在有点太复杂了,你可以再次像这样覆盖所有设置:

6.使用以下命令覆盖所有设置:

.update_traces(marker=dict(color='red'))

在此处输入图片描述

这又把我们带回到了开始的地方。希望你会觉得这很有用!

包含所有可用选项的完整代码片段:

# imports
import plotly.express as px
import pandas as pd

# dataframe
df = px.data.gapminder()
df=df.query("year==2007")

subset = {"Asia", "Europe", "Oceania"}
group_color = {i: 'red' for i in subset}

# plotly express scatter plot
px.scatter(df, x="gdpPercap", y="lifeExp",
           size='pop',
           color='continent',
           color_discrete_sequence=px.colors.qualitative.Alphabet,
           #color_discrete_map=group_color
           color_discrete_map={"Asia": 'rgba(255,0,0,0.4)'}
          )#.update_traces(marker=dict(color='red'))

解决方案 2:

go根据vs px+ 相关图表的类别 + 它是否接受颜色集作为字符串来确定控制颜色的属性名称可能很麻烦

import plotly.graph_objects as go

>>> dir(go.pie)
[..., Marker, ...]

>>> dir(go.pie.Marker)
[..., colors, ...]

一旦你弄清楚了属性

fig.update_traces(
     marker = dict(colors=px.colors.qualitative.Safe)
)
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2941  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1803  
  PLM(产品生命周期管理)系统在企业的产品研发、生产与管理过程中扮演着至关重要的角色。然而,在实际运行中,资源冲突是经常会遇到的难题。资源冲突可能导致项目进度延迟、成本增加以及产品质量下降等一系列问题,严重影响企业的效益与竞争力。因此,如何有效应对PLM系统中的资源冲突,成为众多企业关注的焦点。接下来,我们将详细探讨5...
plm项目管理系统   31  
  敏捷项目管理与产品生命周期管理(PLM)的融合,正成为企业在复杂多变的市场环境中提升研发效率、增强竞争力的关键举措。随着技术的飞速发展和市场需求的快速更迭,传统的研发流程面临着诸多挑战,而将敏捷项目管理理念融入PLM,有望在2025年实现研发流程的深度优化,为企业创造更大的价值。理解敏捷项目管理与PLM的核心概念敏捷项...
plm项目   31  
  模块化设计在现代产品开发中扮演着至关重要的角色,它能够提升产品开发效率、降低成本、增强产品的可维护性与可扩展性。而产品生命周期管理(PLM)系统作为整合产品全生命周期信息的关键平台,对模块化设计有着强大的支持能力。随着技术的不断发展,到 2025 年,PLM 系统在支持模块化设计方面将有一系列令人瞩目的技术实践。数字化...
plm软件   28  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用