繁体   English   中英

Plotly:如何使用883276440288 Graph Objects和Plotly Express在图中定义colors?

[英]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应该是制作 plotly 图形的最简单方法,那么为什么像color='red'这样明显的东西会返回错误

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

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

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

图 1,plot 使用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以定义的颜色散布 plot:

# 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'] 之一但收到:红色

那么这是怎么回事?

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


第 1 部分:本质:

乍一看似乎并非如此,但充分的理由说明为什么color='red'不能像您预期的那样使用px 但首先,如果你想做的只是手动为所有标记设置特定颜色,你可以使用.update_traces(marker=dict(color='red'))多亏了pythons 链接方法 但首先,让我们看一下默认设置:

1.1 Plotly 快递默认

图一、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 colors完全按照您的意愿进行操作:

正如我们已经接触过的px.scattercolor属性不接受像red这样的颜色作为参数。 相反,您可以使用color='continent'轻松区分数据集中的不同变量。 但是px中的 colors 还有很多:


结合使用以下六种方法,您可以使用 plotly express完全按照自己的意愿使用 colors。 请记住,您甚至不必选择 您可以同时使用以下一种部分所有方法。 一种特别有用的方法将显示为13的组合。 但我们稍后会谈到这一点。 这是你需要知道的:

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

color_discrete_sequence=px.colors.qualitative.Alphabet

2.将不同的 colors 赋值给不同的变量,使用color参数

color = 'continent'

3.自定义一个或多个变量colors with

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 部分:细节和情节

以下代码段将生成下面的 plot,它显示了所有大陆在不同 GDP 水平下的预期寿命。 标记的大小代表不同级别的人口,从 go 开始让事情变得更有趣。

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

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

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

color_discrete_sequence=px.colors.qualitative.Alphabet

在此处输入图像描述

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

2.将不同的 colors 赋值给不同的变量,使用color参数

color = 'continent'

在此处输入图像描述

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

3.自定义一个或多个变量colors with

color_discrete_map={"Asia": 'red'}

在此处输入图像描述

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

4.使用字典理解和color_discrete_map将 colors 分配给一个组

# 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)'以获得此效果:

在此处输入图像描述

最后一个plot的完整代码:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM