matplotlib의 그림 내에서 각 플롯 된 선에 대해 새 색상을 선택하는 방법은 무엇입니까?


109

플로팅 된 각 선에 대해 색상을 지정하지 않고 각 선에 고유 한 색상을 지정하고 싶습니다. 하지만 내가 실행하면 :

from matplotlib import pyplot as plt
for i in range(20):
    plt.plot([0, 1], [i, i])

plt.show()

그런 다음이 출력을 얻습니다.

위 코드에 의해 출력 된 그래프 이미지

위의 이미지를 보면 matplotlib가 서로 다른 각 라인에 대해 색상을 선택하려고 시도하지만 결국에는 색상을 재사용한다는 것을 알 수 있습니다. 상위 10 개 라인은 하위 10 개와 동일한 색상을 사용합니다. 이미 사용한 색상이 반복되는 것을 중지하고 사용할 색상 목록을 제공하고 싶습니다.

답변:


59

matplotlib 1.5 이상

axes.set_prop_cycle( )를 사용할 수 있습니다 .

matplotlib 1.0-1.4

axes.set_color_cycle( )를 사용할 수 있습니다 .

matplotlib 0.x

사용할 수 있습니다 Axes.set_default_color_cycle.


1
내가 찾던 라인을 따라 더 ... N 색상 목록을 생성하기 위해 컬러 맵을 사용하는 방법에 대한 정보를 추가 할 수 있습니까?
dlamotte

19
@xyld - 너무 많은 내 자신의 대답을 연결하지만,이 답변의 하단에있는 예제가있다 할 수 없음 : stackoverflow.com/questions/4805048/...은 기본적으로 그냥 이렇게 : [colormap(i) for i in np.linspace(0, 0.9, num_plots)]어디 colormap에서 색상 맵 중 하나입니다 matplotlib.pyplot.cmnumplots번호입니다 당신이 원하는 독특한 색상의. 그래도 구분하기 어려운 색상이 나올 수 있으니주의하세요 !!
Joe Kington

4
좋은 대답 Joe, 그리고 xyld의 질문에 대답하는 것 같으므로 여기에 남겨 두겠습니다. 또한 stackoverflow.com/questions/470690/…
점도

모든 음모에서 작동합니까? Axes3D에서 set_prop_cycle을 시도한 다음 ax.plot_wireframe ()을 사용하여 여러 플롯에 for 루프를 사용했지만 2 개의 플롯이 동일한 색상으로 표시됩니다.
박준호

112

나는 일반적으로 다음 중 두 번째를 사용합니다.

from matplotlib.pyplot import cm
import numpy as np

#variable n below should be number of curves to plot

#version 1:

color=cm.rainbow(np.linspace(0,1,n))
for i,c in zip(range(n),color):
   plt.plot(x, y,c=c)

#or version 2:

color=iter(cm.rainbow(np.linspace(0,1,n)))
for i in range(n):
   c=next(color)
   plt.plot(x, y,c=c)

2의 예 : 반복, 다음 색상이있는 예제 플롯


나는 # 2를 사용했다. 플롯해야하는 채널 목록이 있지만 길이가 다를 수 있습니다. 해당 목록의 n = len 설정은 선택한 색상이 범위에 걸쳐 있는지 확인하는 데 매우 도움이되며 차이를 알 수 있습니다. 그 숫자가 너무 높으면 색상의 차이를보기 어렵습니다.
mauve

# 1을 사용
DevX

11

prop_cycle

color_cycle이 일반화를 위해 1.5에서 더 이상 사용되지 않습니다. http://matplotlib.org/users/whats_new.html#added-axes-prop-cycle-key-to-rcparams

# cycler is a separate package extracted from matplotlib.
from cycler import cycler
import matplotlib.pyplot as plt

plt.rc('axes', prop_cycle=(cycler('color', ['r', 'g', 'b'])))
plt.plot([1, 2])
plt.plot([2, 3])
plt.plot([3, 4])
plt.plot([4, 5])
plt.plot([5, 6])
plt.show()

http://matplotlib.org/1.5.1/examples/color/color_cycle_demo.html(https://stackoverflow.com/a/4971431/895245)에 언급 된 (현재 잘못된 이름) 예제에도 나와 있습니다.

matplotlib 1.5.1에서 테스트되었습니다.


9

자동으로 색상을 변경할 수 있는지는 모르겠지만 루프를 이용하여 다른 색상을 생성 할 수 있습니다.

for i in range(20):
   ax1.plot(x, y, color = (0, i / 20.0, 0, 1)

이 경우 색상은 검정색에서 100 % 녹색까지 다양하지만 원하는 경우 조정할 수 있습니다.

matplotlib plot () 문서를 참조하고 color키워드 인수를 찾으십시오 .

색상 목록을 제공하려면 목록이 충분히 큰지 확인한 다음 루프 색인을 사용하여 색상을 선택하십시오.

colors = ['r', 'b', ...., 'w']

for i in range(20):
   ax1.plot(x, y, color = colors[i])

1
네, 이런 일을 피하고 싶었습니다. 컬러 맵을 살펴 보았지만 사용 방법이 헷갈립니다.
dlamotte

이 솔루션은
컬러

이것은 특히 set_prop_cycle이 실패 할 때 매우 좋습니다. Axes3D의 plot_wireframe ()에서 set_prop_cycle 또는 자동 채색이 실패하는 이유를 모르겠습니다. 그러나 이것은 채색에 대한 일종의 기본 / 수동 솔루션입니다.
박준호

6

다음과 같이 미리 정의 된 "정 성적 컬러 맵"을 사용할 수 있습니다.

from matplotlib.cm import get_cmap

name = "Accent"
cmap = get_cmap(name)  # type: matplotlib.colors.ListedColormap
colors = cmap.colors  # type: list
axes.set_prop_cycle(color=colors)

matplotlib 3.0.3에서 테스트되었습니다. 을 호출 할 수없는 이유에 대한 토론 은 https://github.com/matplotlib/matplotlib/issues/10840 을 참조 하십시오axes.set_prop_cycle(color=cmap) .

사전 정의 된 정성 컬러 맵 목록은 https://matplotlib.org/gallery/color/colormap_reference.html 에서 확인할 수 있습니다 .

질적 컬러 맵 목록


그 다음에 순서대로 처음 3 개 색상을 소요합니다
벤 존스

2

matplotlibrc파일 에서 기본 색상주기를 변경할 수도 있습니다 . 해당 파일의 위치를 ​​모르는 경우 Python에서 다음을 수행하십시오.

import matplotlib
matplotlib.matplotlib_fname()

현재 사용중인 matplotlibrc 파일의 경로가 표시됩니다. 이 파일에서 다른 많은 설정 중에서 axes.color.cycle. 원하는 색상 시퀀스를 입력하기 만하면 모든 플롯에서 찾을 수 있습니다. matplotlib에서 유효한 모든 html 색상 이름을 사용할 수도 있습니다.


0

치로의 응답 노트, 당신은 사용할 수 prop_cycle를 순환하기 matplotlib에 대한 색상의 목록을 설정할 수 있습니다. 그러나 몇 가지 색상입니까? 선 수가 다른 여러 플롯에 동일한 색상주기를 사용하려면 어떻게해야합니까?

한 가지 전술은 https://gamedev.stackexchange.com/a/46469/22397 의 공식과 같은 공식을 사용하여 각 색상이 이전의 모든 색상과 크게 다르도록 무한한 색상 시퀀스를 생성하는 것입니다.

불행히도 prop_cycle무한 시퀀스는 허용하지 않습니다. 하나를 전달하면 영원히 중단됩니다. 그러나 우리는 이러한 시퀀스에서 생성 된 처음 1000 개의 색상을 가져 와서 색상 주기로 설정할 수 있습니다. 이렇게하면 선 수가 정상인 플롯의 경우 구별 가능한 색상을 얻을 수 있습니다.

예:

from matplotlib import pyplot as plt
from matplotlib.colors import hsv_to_rgb
from cycler import cycler

# 1000 distinct colors:
colors = [hsv_to_rgb([(i * 0.618033988749895) % 1.0, 1, 1])
          for i in range(1000)]
plt.rc('axes', prop_cycle=(cycler('color', colors)))

for i in range(20):
    plt.plot([1, 0], [i, i])

plt.show()

산출:

위 코드에 의한 그래프 출력

이제 모든 색상이 다릅니다. 몇 가지를 구별하기 위해 고군분투하고 있음을 인정합니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.