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.Line
和 px.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 expectancy
与 GDP 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
这是怎么回事?
首先,如果需要解释 go
和 px
之间更广泛的差异,请查看 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.scatter
,color
属性不会像 red
这样的颜色作为参数。相反,您可以使用 color='continent'
来轻松区分数据集中的不同变量。但是 px
:
中的颜色还有很多
结合使用以下六种方法,您可以完全使用 plotly express 对颜色进行处理。请记住,您甚至不必 选择 。您可以同时使用one、some、all三种方法。一种特别有用的方法是 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'))
第 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'))
有许多问题和答案以某种方式涉及到这个主题。有了这个贡献,我想清楚地说明为什么 marker = {'color' : 'red'}
这样的简单方法适用于 plotly.graph_objects (go)
,但 color='red'
不适用于 plotly.express (px)
,尽管颜色是px.Line
和 px.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 expectancy
与 GDP 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
这是怎么回事?
首先,如果需要解释 go
和 px
之间更广泛的差异,请查看 here and here。如果绝对不需要任何解释,您会在答案的最后找到一个完整的代码片段,它将揭示 plotly.express
第 1 部分:本质:
一开始看起来可能不是这样,但是有 非常 充分的理由说明 color='red'
不能像您使用 px
所期望的那样工作。但首先,如果您只想 .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.scatter
,color
属性不会像 red
这样的颜色作为参数。相反,您可以使用 color='continent'
来轻松区分数据集中的不同变量。但是 px
:
结合使用以下六种方法,您可以完全使用 plotly express 对颜色进行处理。请记住,您甚至不必 选择 。您可以同时使用one、some、all三种方法。一种特别有用的方法是 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'))
第 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'))