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

时间:2020-08-18 00:21:44

标签: python plotly

有许多问题和答案以某种方式涉及到该主题。通过此贡献,我想清楚地说明为什么marker = {'color' : 'red'}这样的简单方法对plotly.graph_objects (go)有用,而color='red'plotly.express (px)却不起作用,尽管颜色是px.Linepx.Scatter 还有 我想证明为什么它很棒。


因此,如果假设pxeasiest way to make a plotly figure,那么为什么像color='red'这样明显的东西会返回错误

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

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

图1,使用go绘制的图形:

enter image description here

颜色由一个名为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'。预期为['国家/地区,'大陆','年份', 'lifeExp','pop','gdpPercap','iso_alpha','iso_num'],但收到: 红色

那么这是怎么回事?

1 个答案:

答案 0 :(得分:4)

首先,如果需要解释gopx之间的广泛差异,请查看herehere。而且,如果绝对不需要解释,您将在答案的最后找到完整的代码段,该代码段将在plotly.express

中显示带有颜色的多种功能。

第1部分:本质:

乍看起来似乎并非如此,但是有很多理由使color='red'不能像您期望的那样使用px来工作。但是首先,如果您想做的只是manually set a particular color for all markers,则感谢pythons chaining method,您可以使用.update_traces(marker=dict(color='red'))。但首先,让我们看看默认设置:

1.1表示默认值

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

enter image description here

代码1,使用px.Scatter的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")

在这里,正如问题中已经提到的那样,该颜色被设置为通过px.colors.qualitative.Plotly可用的默认打印顺序中的第一种颜色:

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

那看起来还不错。但是,如果您想更改事物甚至同时添加更多信息怎么办?

1.2:如何覆盖默认设置并精确地使用px color做你想要的事情:

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


以下六种方法的组合将使您可以

精确地 使用色绘表示的颜色。请记住,您甚至不必 选择 。您可以同时使用以下 one some all 中的所有方法。一种特别有用的方法将显示为13的组合。但是,我们稍后会谈到。这是您需要知道的:

1。 使用以下命令更改px使用的颜色顺序:

color_discrete_sequence=px.colors.qualitative.Alphabet

2。 color 参数

为不同的变量分配不同的颜色
color = 'continent'

3。 使用

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

4。 使用dict理解和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:

enter image description here

代码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',
          )

为说明上述方法的灵活性,首先让我们 更改颜色顺序 。由于我们刚开始只显示 one 类别和 one 颜色,因此您必须等待后续步骤才能看到实际效果。但是现在这与步骤1中的color_discrete_sequence=px.colors.qualitative.Alphabet相同:

1。 通过

更改px使用的颜色顺序
color_discrete_sequence=px.colors.qualitative.Alphabet

enter image description here

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

2。 color 参数

为不同的变量分配不同的颜色
color = 'continent'

enter image description here

如果您像我一样认为这种特殊的颜色顺序在眼中很容易但是可能无法区分,则可以将您选择的颜色分配给一个或多个大洲,如下所示:

3。 使用

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

enter image description here

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

4。。使用dict理解和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
          )

enter image description here

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

现在让我们退后一步。如果您认为red适合亚洲,但有点太强了,则可以使用rgba之类的'rgba(255,0,0,0.4)'颜色来调整不透明度,以达到以下目的:

enter image description here

最后一个图的完整代码:

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

enter image description here

这使我们回到了起点。希望您会发现它有用!

完整的代码段以及所有可用选项:

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