Plotly:如何使用 plotly.graph_objects 和 plotly.express 在图形中定义颜色?

ves*_*and 6 python plotly plotly-python

有许多问题和答案以一种或另一种方式涉及这个主题。有了这个贡献我想清楚地说明为什么一个简单的计算策略,如marker = {'color' : 'red'}对工作的意愿plotly.graph_objects (go),但color='red'不会为了plotly.express (px)虽然颜色是两者的属性px.Linepx.Scatter而且我想说明为什么它的真棒,它没有。


所以,如果px应该是制作情节图最简单方法,那么为什么像color='red'返回错误这样明显的东西

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

让我applyig一个展示gapminder数据集和显示的散点图Life expectancyGDP 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()
Run Code Online (Sandbox Code Playgroud)

所以让我们用 来试试这个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',
          )
Run Code Online (Sandbox Code Playgroud)

结果:

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

那么这里发生了什么?

ves*_*and 13

首先,如果之间的更广泛的差异的说明gopx要求,请看看这里这里。如果绝对不需要解释,你会在答案的最后找到一个完整的代码片段,它将揭示 plotly.express 中的许多颜色的权力


第 1 部分:本质:

这可能似乎并不那么在第一,但也有非常为什么好的理由color='red'不工作,你所期望的使用px。但首先,如果你想要做的是手动设置特定的颜色为所有标记,你可以这样做,用.update_traces(marker=dict(color='red'))感谢蟒蛇链接方法。但首先,让我们看看默认设置:

1.1 绘图表达默认值

图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")
Run Code Online (Sandbox Code Playgroud)

在这里,正如问题中已经提到的,颜色被设置为默认绘图序列中的第一种颜色px.colors.qualitative.Plotly

['#636EFA', # the plotly blue you can see above
 '#EF553B',
 '#00CC96',
 '#AB63FA',
 '#FFA15A',
 '#19D3F3',
 '#FF6692',
 '#B6E880',
 '#FF97FF',
 '#FECB52']
Run Code Online (Sandbox Code Playgroud)

这看起来很不错。但是,如果您想更改内容甚至同时添加更多信息,该怎么办?

1.2:如何覆盖默认设置并做正是你想要的颜色PX什么:

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


以下六个方法的结合,将让你这样做正是你使用plotly表达颜色喜欢什么。请记住,您甚至不必选择。您可以同时使用以下一种部分全部方法。和一个特定的有用的方法将自己作为揭示的combinatino13。但我们稍后会谈到这一点。这是你需要知道的:

1. 更改 px 使用的颜色序列:

color_discrete_sequence=px.colors.qualitative.Alphabet
Run Code Online (Sandbox Code Playgroud)

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

color = 'continent'
Run Code Online (Sandbox Code Playgroud)

3. 自定义一种或多种可变颜色

color_discrete_map={"Asia": 'red'}
Run Code Online (Sandbox Code Playgroud)

4. 使用 dict comprehension 和color_discrete_map

subset = {"Asia", "Africa", "Oceania"}
group_color = {i: 'red' for i in subset}
Run Code Online (Sandbox Code Playgroud)

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

color_discrete_map={"Asia": 'rgba(255,0,0,0.4)'}
Run Code Online (Sandbox Code Playgroud)

6. 覆盖所有设置:

.update_traces(marker=dict(color='red'))
Run Code Online (Sandbox Code Playgroud)

第 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',
          )
Run Code Online (Sandbox Code Playgroud)

为了说明上述方法的灵活性,让我们首先更改颜色序列。由于我们初学者只展示了一种类别和一种颜色,因此您必须等待后续步骤才能看到真正的效果。但现在color_discrete_sequence=px.colors.qualitative.Alphabet按照步骤 1 的情节相同:

1. 改变px使用的颜色序列

color_discrete_sequence=px.colors.qualitative.Alphabet
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

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

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

color = 'continent'
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

如果你和我一样,认为这个特定的颜色序列在眼睛上很容易但可能有点难以区分,你可以为一个或多个大陆分配一种你选择的颜色,如下所示:

3. 自定义一种或多种可变颜色

color_discrete_map={"Asia": 'red'}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

这非常棒:现在您可以更改序列并为特别有趣的变量选择您喜欢的任何颜色。但是,如果您想将特定颜色分配给更大的子集,则上述方法可能会有些乏味。因此,您也可以通过dict 理解来做到这一点:

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
          )
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

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)'}
          )
Run Code Online (Sandbox Code Playgroud)

如果您认为我们现在变得有点太复杂了,您可以再次覆盖所有设置:

6.覆盖所有设置:

.update_traces(marker=dict(color='red'))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

这让我们又回到了开始的地方。我希望你会发现这很有用!

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

# 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'))
Run Code Online (Sandbox Code Playgroud)

  • 更大的问题/答案“如何覆盖默认值并使用 px 颜色准确地执行您想要的操作”,我无法轻松或快速地找到我在文档中寻找的信息。 (3认同)
  • 很棒的答案! (2认同)
  • 这是一个很好的答案,也是手册的一个很好的要点。不过我想建议一项编辑。我认为在您的示例中强调离散着色仅适用于分类变量或字符串(示例中的“大陆”)非常重要。即使您的整数集有限,它也会被解释为颜色的连续比例。所以像`color_map = {1: "red", 2: "white"}`这样的字典是行不通的,但是在将着色变量转换为字符串之后,`color_map = {"1": "red", "2": “白色”}`会。 (2认同)
  • @vestland,如果你是plotly团队的成员,我还想建议在手册中更加突出这一点。可能是我遗漏了一些东西,但阅读“plotly.express.bar”手册时,我并不清楚离散和连续尺度之间的切换。我用你的例子进行了反复试验来弄清楚。我最终还在plotly.com 上偶然发现了名为“Python 中的离散颜色”的页面,但如果能在该​​函数的文档中找到所有内容就太好了。 (2认同)