Plotly : plotly.graph_objects 및 plotly.express를 사용하여 그림에서 색상을 정의하는 방법은 무엇입니까?

Aug 17 2020

이 주제를 어떤 식 으로든 다루는 많은 질문과 답변이 있습니다. 이 기부에 내가 분명히 보여주고 싶은 이유를 쉽게 같은 approch marker = {'color' : 'red'}에 대한 의지 작업 plotly.graph_objects (go),하지만 color='red'하지 않는 것입니다 plotly.express (px)색상은 모두의 속성이지만 px.Linepx.Scatter. 그리고 나는 그것이 그렇지 않은 것이 왜 대단한지 보여주고 싶습니다.


따라서 음모 그림을 만드는 가장 쉬운 방법px 이라고 가정 하면 오류 를 반환하는 것처럼 명백한 이유는 무엇입니까?color='red'

ValueError : 'color'값이 'data_frame'의 열 이름이 아닙니다.

나를 applyig a로 보여 보자 gapminder 데이터 세트와의 산점도 보여 Life expectancyGDP 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 : 'color'값이 'data_frame'의 열 이름이 아닙니다. [ 'country', 'continent', 'year', 'lifeExp', 'pop', 'gdpPercap', 'iso_alpha', 'iso_num'] 중 하나를 예상했지만 수신 : red

그래서 여기서 무슨 일이 일어나고 있습니까?

답변

7 vestland Aug 18 2020 at 00:22

사이의 폭 넓은 차이점을 설명하면 먼저, go그리고 px필요, 제발 좀 봐 여기 와 여기 . 그리고 설명이 전혀 필요하지 않은 경우 답변의 맨 끝에 완전한 코드 스 니펫이 표시되어 plotly.express의 색상으로 많은 힘을 알 수 있습니다.


1 부 : 본질 :

처음에는 그렇게 보이지 않을 수도 있지만 .NET을 사용하여 예상 한대로 작동하지 않는 데에는 매우 좋은 이유 color='red'가 있습니다 px. 당신이하고 싶은 모든 경우 그러나 우선, 수동으로 모든 마커에 대한 특정 색상을 설정 하면 사용할 수 있도록 할 수있는 .update_traces(marker=dict(color='red'))덕분에 방법을 체인 비단뱀을 . 하지만 먼저 청각 장애인 설정을 살펴 보겠습니다.

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.scattercolor속성은 같은 색상을지지 않습니다 red인수로. 오히려 예를 들어를 사용 color='continent'하여 데이터 세트에서 서로 다른 변수를 쉽게 구별 할 수 있습니다 . 그러나 색상에는 훨씬 더 많은 것이 있습니다 px.


다음 6 가지 방법을 조합 하면 플롯 표현을 사용하여 색상으로 원하는 작업을 정확하게 수행 할 수 있습니다 . 을 선택할 필요조차 없다는 것을 명심 하십시오 . 아래 방법 중 하나 , 일부 또는 모두 를 동시에 사용할 수 있습니다 . 그리고 하나의 특별한 유용한 접근 방식은 13. 그러나 우리는 조금 후에 그것에 대해 알게 될 것입니다. 이것이 당신이 알아야 할 것입니다 :

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 부 : 세부 사항 및 플롯

다음 스 니펫은 다양한 수준의 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',
          )

위의 방법의 유연성을 설명하기 위해 먼저 색상 순서를 변경해 보겠습니다 . 우선 우리는 하나의 카테고리와 하나의 색상 만 표시 하므로 실제 효과를 보려면 후속 단계를 기다려야합니다. 그러나 다음 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 이해력으로 그렇게 할 수있는 방법이 있습니다 .

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