matplotlib의 산점도에서 각 열에 대해 다른 색상 설정
세 가지 데이터 세트가 있다고 가정합니다.
X = [1,2,3,4]
Y1 = [4,8,12,16]
Y2 = [1,4,9,16]
플롯을 분산시킬 수 있습니다.
from matplotlib import pyplot as plt
plt.scatter(X,Y1,color='red')
plt.scatter(X,Y2,color='blue')
plt.show()
이거 10세트로 어떻게 해?
이것을 검색해 보니, 제가 묻고 있는 것에 대한 참조를 찾을 수 있었습니다.
편집: 질문의 명확화(바람직하게)
여러 번 scarter를 호출하면 각 scarter에 동일한 색상밖에 설정할 수 없습니다.또, 수동으로 배열을 설정할 수 있는 것은 알고 있습니다만, 보다 좋은 방법이 있다고 생각합니다.그러면 다음과 같이 질문합니다. "어떻게 하면 각각 다른 색을 가진 여러 데이터 세트를 자동으로 산점도로 표시할 수 있습니까?
도움이 된다면 각 데이터 세트에 고유 번호를 쉽게 할당할 수 있습니다.
나는 '수동'이 무슨 뜻인지 모르겠다.색상 맵을 선택하여 색상 배열을 쉽게 만들 수 있습니다.
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
x = np.arange(10)
ys = [i+x+(i*x)**2 for i in range(10)]
colors = cm.rainbow(np.linspace(0, 1, len(ys)))
for y, c in zip(ys, colors):
plt.scatter(x, y, color=c)
아니면 색깔 cycler을 사용하여 변경할 수 있다.itertools.cycle
그리고,를 사용하여 당신이 순환하고 싶어 그 색깔들은을 지정합니다.next
는 당신이 것을 원하기 위해서.예를 들어,와 3색깔:.
import itertools
colors = itertools.cycle(["r", "b", "g"])
for y in ys:
plt.scatter(x, y, color=next(colors))
생각해 보니, 아마도 그것을 사용하지 않더 싸죠.zip
첫번째로는도:.
colors = iter(cm.rainbow(np.linspace(0, 1, len(ys))))
for y in ys:
plt.scatter(x, y, color=next(colors))
matplotlib에서 여러 색상의 점이 있는 그림을 표시하는 일반적인 방법은 색상 리스트를 모수로 전달하는 것입니다.
예:
import matplotlib.pyplot
matplotlib.pyplot.scatter([1,2,3],[4,5,6],color=['red','green','blue'])
목록 목록이 있고 목록별로 색칠하려는 경우.가장 우아한 방법은 @DSM에 의해 제시된 루프를 실행하여 여러 콜을 분산시키는 것이라고 생각합니다.
단, 어떤 이유로 콜을 1회만 사용하고 싶은 경우는, 리스트의 이해와 플로어 분할을 포함한 큰 색의 리스트를 작성할 수 있습니다.
import matplotlib
import numpy as np
X = [1,2,3,4]
Ys = np.array([[4,8,12,16],
[1,4,9,16],
[17, 10, 13, 18],
[9, 10, 18, 11],
[4, 15, 17, 6],
[7, 10, 8, 7],
[9, 0, 10, 11],
[14, 1, 15, 5],
[8, 15, 9, 14],
[20, 7, 1, 5]])
nCols = len(X)
nRows = Ys.shape[0]
colors = matplotlib.cm.rainbow(np.linspace(0, 1, len(Ys)))
cs = [colors[i//len(X)] for i in range(len(Ys)*len(X))] #could be done with numpy's repmat
Xs=X*nRows #use list multiplication for repetition
matplotlib.pyplot.scatter(Xs,Ys.flatten(),color=cs)
cs = [array([ 0.5, 0. , 1. , 1. ]),
array([ 0.5, 0. , 1. , 1. ]),
array([ 0.5, 0. , 1. , 1. ]),
array([ 0.5, 0. , 1. , 1. ]),
array([ 0.28039216, 0.33815827, 0.98516223, 1. ]),
array([ 0.28039216, 0.33815827, 0.98516223, 1. ]),
array([ 0.28039216, 0.33815827, 0.98516223, 1. ]),
array([ 0.28039216, 0.33815827, 0.98516223, 1. ]),
...
array([ 1.00000000e+00, 1.22464680e-16, 6.12323400e-17,
1.00000000e+00]),
array([ 1.00000000e+00, 1.22464680e-16, 6.12323400e-17,
1.00000000e+00]),
array([ 1.00000000e+00, 1.22464680e-16, 6.12323400e-17,
1.00000000e+00]),
array([ 1.00000000e+00, 1.22464680e-16, 6.12323400e-17,
1.00000000e+00])]
간단한 수정
수집 유형이 하나만 있는 경우(예: 오류 막대가 없는 산란)에는 해당 수집 유형을 표시한 후 색상을 변경할 수도 있습니다. 경우에 따라 이 작업을 수행하는 것이 더 쉽습니다.
import matplotlib.pyplot as plt
from random import randint
import numpy as np
#Let's generate some random X, Y data X = [ [frst group],[second group] ...]
X = [ [randint(0,50) for i in range(0,5)] for i in range(0,24)]
Y = [ [randint(0,50) for i in range(0,5)] for i in range(0,24)]
labels = range(1,len(X)+1)
fig = plt.figure()
ax = fig.add_subplot(111)
for x,y,lab in zip(X,Y,labels):
ax.scatter(x,y,label=lab)
필요한 유일한 코드는 다음과 같습니다.
#Now this is actually the code that you need, an easy fix your colors just cut and paste not you need ax.
colormap = plt.cm.gist_ncar #nipy_spectral, Set1,Paired
colorst = [colormap(i) for i in np.linspace(0, 0.9,len(ax.collections))]
for t,j1 in enumerate(ax.collections):
j1.set_color(colorst[t])
ax.legend(fontsize='small')
동일한 하위구에 서로 다른 산점도 여러 개가 있더라도 출력은 다른 색상을 제공합니다.
당신은 늘 사용할 수 있다.plot()
그렇게 같은 역할:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
ys = [i+x+(i*x)**2 for i in range(10)]
plt.figure()
for y in ys:
plt.plot(x, y, 'o')
plt.show()
이 질문은 2013년 1월 이전과 matplotlib 1.3.1(2013년 8월) 이전에 다소 까다롭습니다.matplotlib 웹사이트에서 찾을 수 있는 가장 오래된 안정 버전입니다.하지만 그 이후로는 꽤 사소하다.
왜냐하면 현재 버전matplotlib.pylab.scatter
지원:색 이름 문자열의 배열, float번호의 컬러 지도로 배열, RGB나 RGBA의 배열을 배정한다.
이 답변은 2015년 내 2013년 버전을 바로잡으려는 @Oxinabox의 끝없는 열정에 바칩니다.
한 번의 호출로 여러 색상의 scat 명령어를 사용하는 두 가지 옵션이 있습니다.
~하듯이로
pylab.scatter
명령 지원은 무엇이든지 색상 원하는 것을 하기;명령지원에서는 RGBA어레이를 사용하여 원하는 색상을 사용할 수 있습니다 RGBA배열을 사용한다.2013년 초에는 명령어가 전체 산란점 수집에 대해 단일 색상만 지원하므로 방법이 없습니다.저는 10,000라인 프로젝트를 할 때 우회할 수 있는 일반적인 해결책을 찾아냈기 때문에 매우 촌스럽지만 어떤 형태, 색상, 크기, 투명하게 할 수 있습니다.이 트릭은 그리기 경로 수집, 라인 수집에도 적용할 수 있습니다.
그 코드도코드는 또한의영감을 얻습니다 소스코드에선 소스 코드에 영감을 받았다.pyplot.scatter
그저 뭘의 산란 트리거 없이 그림 그려 않다.그림 그리기를 트리거하지 않고 산란 동작을 그대로 재현했습니다.
pyplot.scatter
PatchCollection
오브젝트,.py" 변수 "matplotlib/collections.py"는 "matplotlib/collections.py"입니다._facecolors
Collection
및 " " " " "set_facecolors
따라서 그릴 산점점이 있을 때마다 다음을 수행할 수 있습니다.
# rgbaArr is a N*4 array of float numbers you know what I mean
# X is a N*2 array of coordinates
# axx is the axes object that current draw, you get it from
# axx = fig.gca()
# also import these, to recreate the within env of scatter command
import matplotlib.markers as mmarkers
import matplotlib.transforms as mtransforms
from matplotlib.collections import PatchCollection
import matplotlib.markers as mmarkers
import matplotlib.patches as mpatches
# define this function
# m is a string of scatter marker, it could be 'o', 's' etc..
# s is the size of the point, use 1.0
# dpi, get it from axx.figure.dpi
def addPatch_point(m, s, dpi):
marker_obj = mmarkers.MarkerStyle(m)
path = marker_obj.get_path()
trans = mtransforms.Affine2D().scale(np.sqrt(s*5)*dpi/72.0)
ptch = mpatches.PathPatch(path, fill = True, transform = trans)
return ptch
patches = []
# markerArr is an array of maker string, ['o', 's'. 'o'...]
# sizeArr is an array of size float, [1.0, 1.0. 0.5...]
for m, s in zip(markerArr, sizeArr):
patches.append(addPatch_point(m, s, axx.figure.dpi))
pclt = PatchCollection(
patches,
offsets = zip(X[:,0], X[:,1]),
transOffset = axx.transData)
pclt.set_transform(mtransforms.IdentityTransform())
pclt.set_edgecolors('none') # it's up to you
pclt._facecolors = rgbaArr
# in the end, when you decide to draw
axx.add_collection(pclt)
# and call axx's parent to draw_idle()
이것으로 충분합니다.
각 시리즈에 대해 랜덤 RGB 색상 발생기 사용
c = color[np.random.random_sample(), np.random.random_sample(), np.random.random_sample()]
큰 데이터 세트와 제한된 색상의 훨씬 더 빠른 솔루션은 Panda와 그룹별 기능을 사용하는 것입니다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import time
# a generic set of data with associated colors
nsamples=1000
x=np.random.uniform(0,10,nsamples)
y=np.random.uniform(0,10,nsamples)
colors={0:'r',1:'g',2:'b',3:'k'}
c=[colors[i] for i in np.round(np.random.uniform(0,3,nsamples),0)]
plt.close('all')
# "Fast" Scatter plotting
starttime=time.time()
# 1) make a dataframe
df=pd.DataFrame()
df['x']=x
df['y']=y
df['c']=c
plt.figure()
# 2) group the dataframe by color and loop
for g,b in df.groupby(by='c'):
plt.scatter(b['x'],b['y'],color=g)
print('Fast execution time:', time.time()-starttime)
# "Slow" Scatter plotting
starttime=time.time()
plt.figure()
# 2) group the dataframe by color and loop
for i in range(len(x)):
plt.scatter(x[i],y[i],color=c[i])
print('Slow execution time:', time.time()-starttime)
plt.show()
또한 분산도에 필요한 모든 색상을 포함하는 색상 리스트를 작성하고 다음과 같이 내부에 매개변수로 지정할 수 있습니다.
colors = ["red", "blue", "green"]
plt.scatter(X, Y, color = colors)
언급URL : https://stackoverflow.com/questions/12236566/setting-different-color-for-each-series-in-scatter-plot-on-matplotlib
'programing' 카테고리의 다른 글
OSX 10.6에서 Python 및 Django와 함께 MySQLdb를 사용하는 방법 (0) | 2022.10.08 |
---|---|
Python을 사용하여 문자열에서 문자를 삭제하는 방법 (0) | 2022.10.08 |
를 참조해 주세요.Unmarshal Exception: 예기치 않은 요소(uri:", 로컬:"Group") (0) | 2022.10.08 |
Fetch GET 요청을 사용하여 쿼리 문자열 설정 (0) | 2022.10.08 |
사용자가 HTTP가 아닌 HTTPS를 통해 내 페이지에 강제로 액세스하도록 하려면 어떻게 해야 합니까? (0) | 2022.10.08 |