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

Plotly: How to define colors in a figure using Plotly Graph Objects and Plotly Express?

有许多问题和答案以某种方式涉及到这个主题。有了这个贡献,我想清楚地说明为什么 marker = {'color' : 'red'} 这样的简单方法适用于 plotly.graph_objects (go),但 color='red' 不适用于 plotly.express (px),尽管颜色是px.Linepx.Scatter 我想证明为什么它没有那么棒。


所以,如果 px 应该是 easiest way to make a plotly figure,那么为什么像 color='red' return 这样明显的错误

ValueError: Value of 'color' is not the name of a column in 'data_frame'.

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

让我通过应用一个 gapminder 数据集来演示,并显示所有(至少 大多数 )的 Life expectancyGDP per capita 的散点图截至 2007 的世界各国。如下所示的基本设置将产生以下图

图 1,绘图使用 go:

颜色由名为 的循环设置,但此处使用 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: Value of 'color' is not the name of a column in 'data_frame'. Expected one of ['country', 'continent', 'year', 'lifeExp', 'pop', 'gdpPercap', 'iso_alpha', 'iso_num'] but received: red

这是怎么回事?

首先,如果需要解释 gopx 之间更广泛的差异,请查看 here and here。如果绝对不需要任何解释,您会在答案的最后找到一个完整的代码片段,它将揭示 plotly.express

中许多带有颜色的权力

第 1 部分:本质:

一开始看起来可能不是这样,但是有 非常 充分的理由说明 color='red' 不能像您使用 px 所期望的那样工作。但首先,如果您只想 you can do so using .update_traces(marker=dict(color='red')) thanks to pythons chaining method。但首先,让我们看看默认设置:

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.scattercolor 属性不会像 red 这样的颜色作为参数。相反,您可以使用 color='continent' 来轻松区分数据集中的不同变量。但是 px:

中的颜色还有很多

结合使用以下六种方法,您可以完全使用 plotly express 对颜色进行处理。请记住,您甚至不必 选择 。您可以同时使用onesomeall三种方法。一种特别有用的方法是 13 的组合。但我们稍后会谈到这一点。这是你需要知道的:

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'))

第 2 部分:细节和情节

以下代码片段将生成下图,显示所有大陆在不同 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',
          )

为了说明上述方法的灵活性,让我们先改变颜色顺序。由于我们一开始只展示一个类别和一个颜色,您必须等待后续步骤才能看到真正的效果。但是,根据第 1 步,color_discrete_sequence=px.colors.qualitative.Alphabet 现在是相同的图:

1.

改变px使用的色序
color_discrete_sequence=px.colors.qualitative.Alphabet

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

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

color = 'continent'

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

3. 使用

自定义一种或多种可变颜色
color_discrete_map={"Asia": 'red'}

这非常棒:现在您可以更改顺序并为特别有趣的变量选择您喜欢的任何颜色。但是如果您想将特定颜色分配给更大的子集,上述方法可能会有点乏味。因此,您也可以使用 dict comprehension:

来做到这一点

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'))