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) 플롯하려는 경우 다음 중 하나를 수행하십시오.
- 다른 그림에 배치하거나 (한 그림에 몇 개의 하위 그림을 사용하는 것을 고려하십시오) 또는
- 색상 이외의 색상 (예 : 마커 스타일 또는 선 두께)을 사용하여 구별하십시오.
그렇지 않으면 매우 지저분한 음모로 마무리됩니다! 당신이 무엇을하고 있는지 읽을 사람에게 친절하고 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()
답변
나중에 설정
플롯 할 플롯의 수를 모르는 경우을 사용하여 플롯에서 직접 숫자를 검색하여 플롯 한 후에 색상을 변경할 수 있습니다. .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 요청입니까? 계속 읽으면
같은 그림에서 다른 플롯에 대해 다른 색상을 넣는 방법을 알려주시겠습니까?
각각의 플롯 (각 axes
Matplotlib의 관점에서 )은 자체 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.Cycler
만 type(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)