2012-04-20 3 views
3

Matplotlib를 사용하여 곡선 계열을 그래프로 표시하려고합니다. 나는 scatter()를 사용하여 데이터를 직접 그래프로 그린 다음 plot()을 사용하여 맞는 선 (scipy에서 최소 제곱)을 플로팅합니다. 얼마나 많은 데이터가 사전에 저장 될지, 한계 등을 알지 못합니다.MatPlotLib을 사용한 색상 및 선 쓰기

데이터의 한 세트에서 모든 것이 일치하도록이 라인과 포인트의 색상을 순환시킬 수 있어야합니다. Plot은 내부 기본값을 사용하여 색상을 회전시키고 Scatter는 모든 색상으로 나옵니다. 데이터 세트가 가까워 질 수 있습니다. 따라서 어떤 점에서 어느 점이 어느 정도 가까운 지점에 있는지 명확히 알 수 있으며, 수동으로 색상을 만드는 곡선이 몇 개인 지 알 수 없으므로 선택은 확장 할 수 없습니다.

또한 이들이 곡선 계열이므로 (트랜지스터 플롯을 생각해보십시오), 커브로 관련 레이블을 표시 할 수 있어야합니다. 내가하고 싶은 것은 적합 라인 자체에 정보를 쓰는 것입니다.

누구에게도 좋은 방법이 있습니까?

답변

13

모든 질문에 대답하려고 시도합니다. 아래 코드는 최대 7 색을 순환시킵니다. 더 많은 것을 원한다면 다른 대답과 같이보다 정교한 생성기를 만들어야합니다.

import numpy as np 
from matplotlib import pyplot as plt 

def get_color(): 
    for item in ['r', 'g', 'b', 'c', 'm', 'y', 'k']: 
     yield item 

x = 0.3 * np.array(range(40)) 

color = get_color() 

for group in range(5): 
    # generates a collection of points 
    y = np.exp2(x + 0.5 * group) 
    # fit to a polynomial 
    z = np.polyfit(x, y, 6) 
    p = np.poly1d(z) 

    acolor = next(color) 

    plt.scatter(x, y, color=acolor, marker='o') 
    plt.plot(x, p(x), acolor + '-', label=str(group)) 

plt.legend() 
plt.xlim((0, 15)) 
plt.show() 

enter image description here

상기 코드 발생기는 예를 들면 overkilling 약간이지만 더 복잡한 계산을하기위한 구조를 제공한다. 당신은 단지 몇 가지 색상이 필요한 경우 간단한 반복자에게

>>> color = iter(list_of_colors) 
>>> acolor = next(color) 

를 사용할 수 있습니다 당신이 끝없이 순환해야하는 경우, 당신은 itertools.cycle 사용할 수 있습니다

>>> from itertools import cycle 
>>> color = cycle(['r', 'g', 'b', 'c', 'm', 'y', 'k']) 
>>> next(color) 
'r' 
>>> 

편집 : 당신은 얻을 몇 가지 옵션이 있습니다 n 다른 색상. 전에 지적한대로 다른 답변에 표시된 방법을 사용하여 발전기를 사용할 수 있습니다. 예를 들어, get_color를 다른 생성기로 바꾸기 :

import colorsys 
import numpy as np 
from matplotlib import pyplot as plt 

def get_color(color): 
    for hue in range(color): 
     hue = 1. * hue/color 
     col = [int(x) for x in colorsys.hsv_to_rgb(hue, 1.0, 230)] 
     yield "#{0:02x}{1:02x}{2:02x}".format(*col) 

x = 0.3 * np.array(range(40)) 

color = get_color(15) 

for group in range(15): 
    # generates a collection of points 
    y = np.exp2(x + 0.5 * group) 
    # fit to a polynomial 
    z = np.polyfit(x, y, 6) 
    p = np.poly1d(z) 

    acolor = next(color) 

    plt.scatter(x, y, color=acolor, marker='o') 
    plt.plot(x, p(x), color=acolor, linestyle='dashed', label=str(group)) 

plt.legend() 
plt.xlim((0, 15)) 
plt.show() 

15 가지 색상이 있습니다.

enter image description here

비슷한 색상 그러나 좋은 해상도/대비를 포기하지 않을 연속된다. 당신과 색조 값을 건너 뛰어 대비를 증가시킬 수있다 :

for hue in range(0, color*3, 3): 

많은 선을 그리기 전설이다 다른 문제 ...

+0

감사합니다. 이것은 즉각적인 문제를 해결하고 제가 알지 못했던 수확량과 다음 진술에 대해 알게했습니다.그러나 임의로 많은 수의 색상이 필요한 경우 어떻게 할 것입니까? 예를 들어, 100 개의 데이터 세트가 있고 각 데이터 세트가 완전히 구별되어야한다고 가정합니다 (예 : 자전거가 좋지 않음). 어떻게 색상 반복자를 생성하겠습니까? 데이터 세트의 수를 명시 적으로 코딩하지 않고 코드를 확장 할 수 있습니까? – Elliot

2

여러 줄에 동일한 색상을 지정하고 수동으로 모두 정의하지 않고 원하는 수의 줄을 지원하는 비슷한 경우가 있습니다. 당신이 볼 수 있듯이

import colorsys 

def get_colors(i, total): 
    hue = i*(1.0/total) 
    dark = [int(x) for x in colorsys.hsv_to_rgb(hue, 1.0, 100)] 
    light = [int(x) for x in colorsys.hsv_to_rgb(hue, 1.0, 230)] 
    return "#{0:02x}{1:02x}{2:02x}".format(*dark), "#{0:02x}{1:02x}{2:02x}".format(*light) 

, 그것은 어두운에서 최대 거리와 빛 버전 total 색상을 생성 : 이것은 내가 색상을 생성 해낸 기능입니다.