有许多问题和答案以一种或另一种方式涉及这个主题。有了这个贡献,我想清楚地说明为什么一个简单的方法,比如 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'
这样显而易见的事情?返回错误
ValueError: Value of 'color' is not the name of a column in 'data_frame'.
让我通过 applyig 来演示 gapminder数据集并显示
Life expectancy
的散点图与 GDP 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()
所以让我们用 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和 here .如果绝对不需要解释,你会在答案的最后找到一个完整的代码片段,它将揭示 plotly.express 中的许多颜色的权力
第 1 部分:本质:
乍一看可能不是这样,但 color='red'
是有充分理由的。使用 px
时不会像您期望的那样工作.但首先,如果您只想做 manually set a particular color for all markers您可以使用 .update_traces(marker=dict(color='red'))
这样做感谢 pythons chaining method .但首先,让我们看看默认设置:
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")
在这里,正如问题中已经提到的,颜色被设置为默认绘图序列中的第一种颜色,可通过 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 的颜色。请记住,您甚至不必选择 .您可以同时使用以下一种、部分或全部方法。一种特别有用的方法将显示为
1
的组合。和 3
.但我们稍后会谈到这一点。这是你需要知道的:1. 更改 px 使用的颜色序列:
color_discrete_sequence=px.colors.qualitative.Alphabet
2. 使用 color
为不同的变量分配不同的颜色争论color = 'continent'
3. 自定义一种或多种可变颜色color_discrete_map={"Asia": 'red'}
4. 使用 dict comprehension 和 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 部分:细节和 plotly
下面的代码片段将生成下面的图表,该图表显示了所有大陆在不同 GDP 水平下的预期生命周期。标记的大小代表不同级别的人群,让事情从一开始就变得更有趣。
plotly 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',
)
为了说明上述方法的灵活性,让我们先来 更改颜色顺序 .由于我们初学者只展示了一种类别和一种颜色,因此您必须等待后续步骤才能看到真正的效果。但现在这里的 plotly 与 color_discrete_sequence=px.colors.qualitative.Alphabet
相同按照步骤 1: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)'
得到这个:最后一个 plotly 的完整代码:
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'))
关于python - Plotly:如何使用 plotly.graph_objects 和 plotly.express 在图形中定义颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63460213/