Plotly:plotly.graph_objectsとplotly.expressを使用して図の色を定義する方法は?

Aug 17 2020

このトピックに何らかの形で触れる多くの質問と回答があります。この貢献で、私ははっきりなど、理由は簡単approch表示したいmarker = {'color' : 'red'}のための意志の仕事をplotly.graph_objects (go)、しかしcolor='red'でしょうではないためplotly.express (px)色は両方の属性ですがpx.Line及びpx.Scatterそして、なぜそうでないのが素晴らしいのかを示したいと思います。


だから、もしプロット図を作る最も簡単な方法であるpxと思われるなら、なぜエラーを返すのと同じくらい明白な何かをするのですか?color='red'

ValueError:「color」の値は「data_frame」の列の名前ではありません。

ギャップマインダーデータセットを適用してデモンストレーションし、現在の世界のすべて(少なくともほとんど)の国のLife expectancy対の散布図を示します。以下のような基本的な設定では、次のプロットが生成されますGDP per capita2007

図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:「color」の値は「data_frame」の列の名前ではありません。['country'、 'continent'、 'year'、 'lifeExp'、 'pop'、 'gdpPercap'、 'iso_alpha'、 'iso_num']のいずれかが必要ですが、受信されました:赤

では、ここで何が起こっているのでしょうか。

回答

7 vestland Aug 18 2020 at 00:22

間のより広範な違いの説明場合はまず、goとがpx必要とされ、見てくださいこことここ。また、説明がまったく必要ない場合は、回答の最後に完全なコードスニペットがあり、plotly.expressの色で多くの力を明らかにします。


パート1:エッセンス:

最初はそうではないように思われるかもしれませんが、を使用すると期待どおりに機能しないのには非常に理由がありcolor='red'ますpx。しかし、まず第一に、あなたがしたいのがすべてのマーカーに特定の色を手動で設定することだけであるならば、あなたはpythonschainingmethodの.update_traces(marker=dict(color='red'))おかげでそれを使うことができます。しかし、最初に、deafult設定を見てみましょう:

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


次の6つの方法を組み合わせることで、plotlyexpressを使用して色でやりたいことを正確に行うことができます。を選択する必要さえないことを覚えておいてください。以下の1つ一部、またはすべての方法を同時に使用できます。そして、1つの特定の有用なアプローチは、との組み合わせとしてそれ自体を明らかに13ます。しかし、それについては後で説明します。これはあなたが知る必要があることです:

1.pxで使用されるカラーシーケンスを次のように変更します。

color_discrete_sequence=px.colors.qualitative.Alphabet

2. 引数を使用して、さまざまな変数にさまざまな色を割り当て color ます

color = 'continent'

3.1 つまたは複数の可変色をでカスタマイズします

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:

コード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つのカテゴリと1つの色しか表示していないため、実際の効果を確認するには、次の手順を待つ必要があります。しかしcolor_discrete_sequence=px.colors.qualitative.Alphabet、これはステップ1と同じプロットです。

1.pxで使用されるカラーシーケンスをで変更します

color_discrete_sequence=px.colors.qualitative.Alphabet

それでは、Alphabetカラーシーケンスの色をさまざまな大陸に適用してみましょう。

2. 引数を使用して、さまざまな変数にさまざまな色を割り当て color ます

color = 'continent'

私のように、この特定の色の順序は目には簡単ですが、おそらく少し区別がつかないと思う場合は、次のように1つ以上の大陸に選択した色を割り当てることができます。

3.1 つまたは複数の可変色をでカスタマイズします

color_discrete_map={"Asia": 'red'}

そして、これは非常に素晴らしいです。シーケンスを変更して、特に興味深い変数に好きな色を選択できるようになりました。ただし、特定の色をより大きなサブセットに割り当てたい場合は、上記の方法が少し面倒になる可能性があります。だからここにあなたがdictの理解でそれをする方法もあります:

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
          )

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