단일 그림에서 다른 플롯에 대해 서로 다른 색의 선을 얻는 방법은 무엇입니까?


202

matplotlib플롯을 만드는 데 사용 하고 있습니다. 파이썬에서 자동으로 생성 해야하는 다른 색상으로 각 플롯을 식별해야합니다.

같은 그림에서 다른 플롯에 대해 다른 색상을 넣는 방법을 알려주시겠습니까?

답변:


424

Matplotlib는 기본적으로이 작업을 수행합니다.

예 :

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)
plt.show()

컬러 사이클링을 보여주는 기본 플롯

이미 알고 있듯이 쉽게 범례를 추가 할 수 있습니다.

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)

plt.legend(['y = x', 'y = 2x', 'y = 3x', 'y = 4x'], loc='upper left')

plt.show()

범례가있는 기본 플롯

순환 될 색상을 제어하려는 경우 :

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

plt.gca().set_color_cycle(['red', 'green', 'blue', 'yellow'])

plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)

plt.legend(['y = x', 'y = 2x', 'y = 3x', 'y = 4x'], loc='upper left')

plt.show()

기본 색상 순환을 제어하는 ​​플롯

matplotlib에 익숙하지 않은 경우 튜토리얼을 시작하는 것이 좋습니다 .

편집하다:

먼저, 하나의 그림에 많은 것을 (> 5) 플롯하려는 경우 다음 중 하나를 수행하십시오.

  1. 다른 그림에 배치하거나 (한 그림에 몇 개의 하위 그림을 사용하는 것을 고려하십시오) 또는
  2. 색상 이외의 색상 (예 : 마커 스타일 또는 선 두께)을 사용하여 구별하십시오.

그렇지 않으면 매우 지저분한 음모로 마무리됩니다! 당신이 무엇을하고 있는지 읽을 사람에게 친절하고 15 가지 다른 것들을 하나의 그림에 담그려고하지 마십시오 !!

그 외에도 많은 사람들이 다양한 각도로 색맹이며, 미묘하게 다른 많은 색상을 구별하는 것은 당신이 알고있는 것보다 많은 사람들에게 어렵습니다.

이미 말했듯이, 상대적으로 뚜렷한 20 가지 색상으로 한 축에 20 개의 선을 넣으려면 다음과 같이하십시오.

import matplotlib.pyplot as plt
import numpy as np

num_plots = 20

# Have a look at the colormaps here and decide which one you'd like:
# http://matplotlib.org/1.2.1/examples/pylab_examples/show_colormaps.html
colormap = plt.cm.gist_ncar
plt.gca().set_prop_cycle(plt.cycler('color', plt.cm.jet(np.linspace(0, 1, num_plots))))

# Plot several different functions...
x = np.arange(10)
labels = []
for i in range(1, num_plots + 1):
    plt.plot(x, i * x + 5 * i)
    labels.append(r'$y = %ix + %i$' % (i, 5*i))

# I'm basically just demonstrating several different legend options here...
plt.legend(labels, ncol=4, loc='upper center', 
           bbox_to_anchor=[0.5, 1.1], 
           columnspacing=1.0, labelspacing=0.0,
           handletextpad=0.0, handlelength=1.5,
           fancybox=True, shadow=True)

plt.show()

주어진 컬러 맵을 기준으로 20 개의 선에 대한 고유 한 색상


17
최신 예제 인 matplotlib의 최신 버전에서는 set_color_cycle더 이상 사용되지 않으므로 라인이 필요에 따라 라인을 plt.gca().set_prop_cycle(plt.cycler('color', plt.cm.jet(np.linspace(0, 1, num_plots))))변경 plt.cm.YOUR_PREFERED_COLOR_MAP해야합니다.
Nate

1
@JoeKington : 설명은 훌륭했습니다. 대단히 감사합니다
Rika

이것은 대단하다. 대화식으로 만드는 방법이 있습니까? ggplotly ()에 RI의 변환 ggplot 예, 그리고 플롯의 HTML 상호 작용이된다
kRazzy R

OP는 Matplotlib이 단일 플롯 (단일 axes) 에서 적절하게 다른 곡선의 색상을 적절하게 지정 하고 다른 플롯 (다른 axes) 에서 단일 라인의 색상을 변경하는 것에 대해 물었다는 것을 확신합니다. 질문 (OP가 요청한 내용과 다를 수 있지만,이 단일 질문을하고 사라져서 아무도 말할 수 없습니다!) — +1
gboffi

37

나중에 설정

플롯 할 플롯의 수를 모르는 경우을 사용하여 플롯에서 직접 숫자를 검색하여 플롯 한 후에 색상을 변경할 수 있습니다. .lines이 솔루션을 사용합니다.

임의의 데이터

import matplotlib.pyplot as plt
import numpy as np

fig1 = plt.figure()
ax1 = fig1.add_subplot(111)


for i in range(1,15):
    ax1.plot(np.array([1,5])*i,label=i)

필요한 코드 조각 :

colormap = plt.cm.gist_ncar #nipy_spectral, Set1,Paired   
colors = [colormap(i) for i in np.linspace(0, 1,len(ax1.lines))]
for i,j in enumerate(ax1.lines):
    j.set_color(colors[i])
  

ax1.legend(loc=2)

결과는 다음과 같습니다.여기에 이미지 설명을 입력하십시오


8

TL; DR 아니요, 자동으로 수행 할 수 없습니다 . 네 가능합니다.

import matplotlib.pyplot as plt
my_colors = plt.rcParams['axes.prop_cycle']() # <<< note that we CALL the prop_cycle
fig, axes = plt.subplots(2,3)
for ax in axes.flatten(): ax.plot((0,1), (0,1), **next(my_colors))

여기에 이미지 설명을 입력하십시오 그림 ( axes)의 각 그림 ( figure)에는 고유 한 색상주기가 있습니다. 각 그림마다 다른 색상을 강요하지 않으면 모든 그림이 동일한 색상 순서를 공유하지만 "자동"이라는 의미를 조금 늘리면 할 수 있습니다.


OP는 썼다

[...] [Matplotlib]에서 자동으로 생성해야하는 다른 색상으로 각 플롯을 식별해야합니다.

그러나 ... Matplotlib은 자동으로 각 곡선마다 다른 색상을 생성합니다

In [10]: import numpy as np
    ...: import matplotlib.pyplot as plt

In [11]: plt.plot((0,1), (0,1), (1,2), (1,0));
Out[11]:

여기에 이미지 설명을 입력하십시오

그렇다면 왜 OP 요청입니까? 계속 읽으면

같은 그림에서 다른 플롯에 대해 다른 색상을 넣는 방법을 알려주시겠습니까?

각각의 플롯 (각 axesMatplotlib의 관점에서 )은 자체 color_cycle(또는 2018 년에는 prop_cycle) 및 각 플롯 ( axes)은 동일한 순서로 동일한 색상을 재사용하기 때문에 의미가 있습니다.

In [12]: fig, axes = plt.subplots(2,3)

In [13]: for ax in axes.flatten():
    ...:     ax.plot((0,1), (0,1))

여기에 이미지 설명을 입력하십시오

이것이 원래 질문의 의미라면, 하나의 가능성은 각 그림에 대해 다른 색을 명시 적으로 명명하는 것입니다.

플롯이 자주 발생하는 경우 루프에서 생성 되는 경우 Matplotlib에서 자동으로 선택한 색상을 재정의하는 추가 루프 변수가 있어야합니다 .

In [14]: fig, axes = plt.subplots(2,3)

In [15]: for ax, short_color_name in zip(axes.flatten(), 'brgkyc'):
    ...:     ax.plot((0,1), (0,1), short_color_name)

여기에 이미지 설명을 입력하십시오

또 다른 가능성은 사이 클러 객체를 인스턴스화하는 것입니다

from cycler import cycler
my_cycler = cycler('color', ['k', 'r']) * cycler('linewidth', [1., 1.5, 2.])
actual_cycler = my_cycler()

fig, axes = plt.subplots(2,3)
for ax in axes.flat:
    ax.plot((0,1), (0,1), **next(actual_cycler))

여기에 이미지 설명을 입력하십시오

참고 type(my_cycler)입니다 cycler.Cyclertype(actual_cycler)입니다 itertools.cycle.


3

이전 게시물에 제공된 마지막 루프 답변을 약간 개선하고 싶습니다 (해당 게시물은 정확하고 여전히 수락해야합니다). 마지막 예제 plt.label(LIST)에 레이블 을 지정할 때 내재 된 가정 은 레이블 번호 X를 X LIST번째 시간 plot에 해당하는 행 에 넣는 것입니다 . 나는 전에이 접근법에 문제가 발생했습니다. matplotlibs 문서 ( http://matplotlib.org/users/legend_guide.html#adjusting-the-order-of-legend-item )에 따라 범례를 작성하고 레이블을 사용자 정의하는 권장 방법 은 레이블의 느낌을 따뜻하게하는 것입니다. 그들이 생각하는 정확한 음모와 함께 :

...
# Plot several different functions...
labels = []
plotHandles = []
for i in range(1, num_plots + 1):
    x, = plt.plot(some x vector, some y vector) #need the ',' per ** below
    plotHandles.append(x)
    labels.append(some label)
plt.legend(plotHandles, labels, 'upper left',ncol=1)

** : Matplotlib 범례가 작동하지 않습니다


3
간단히 말해 : "label"kwarg를 사용하여 인수없이 범례를 플로팅하고 호출 할 수도 있습니다.
Joe Kington
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.