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

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

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



답변

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 개의 선에 대한 고유 한 색상


답변

나중에 설정

플롯 할 플롯의 수를 모르는 경우을 사용하여 플롯에서 직접 숫자를 검색하여 플롯 한 후에 색상을 변경할 수 있습니다. .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)

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


답변

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.


답변

이전 게시물에 제공된 마지막 루프 답변을 약간 개선하고 싶습니다 (해당 게시물은 정확하고 여전히 수락해야합니다). 마지막 예제 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 범례가 작동하지 않습니다


답변