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

标签 python colors plotly plotly-python

有许多问题和答案以一种或另一种方式涉及这个主题。有了这个贡献,我想清楚地说明为什么一个简单的方法,比如 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 绘图:
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: 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为必填项,请看 herehere .如果绝对不需要解释,你会在答案的最后找到一个完整的代码片段,它将揭示 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 enter image description here
代码 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:
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',
          )
为了说明上述方法的灵活性,让我们先来 更改颜色顺序 .由于我们初学者只展示了一种类别和一种颜色,因此您必须等待后续步骤才能看到真正的效果。但现在这里的 plotly 与 color_discrete_sequence=px.colors.qualitative.Alphabet 相同按照步骤 1:
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. 使用字典理解和 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
最后一个 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'))
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'))

关于python - Plotly:如何使用 plotly.graph_objects 和 plotly.express 在图形中定义颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63460213/

相关文章:

python - 询问数字或字母时如何获得有效答案

python - 为什么我收到 SyntaxError : (unicode error) 'utf-8' codec can't decode byte 0x96 in position 0: invalid start byte

Jquery 交替行颜色在悬停功能后似乎不起作用

python - 具有日期范围的条形图在绘图中剪切条形图

python - 如何在 R 中将交互式绘图保存为本地文件?

python - 在 python 中限制 raw_input

python - 如何在 Seaborn Jointplot 中为单个标记着色?

actionscript-3 - 在 ActionScript 3 中进行颜色转换

r - 使用多个 geom 时如何消除 ggplotly 重复的图例条目

python - 在 python 中对数组使用多个索引