2017-05-10 5 views
-2

나는 (인덱스로 설정된) 날짜와 팬덤 데이터 프레임을 가지고 있고 합계에 포함 된 카테고리 라벨의 열 두 개 (원래 데이터 프레임의 groupby에 의해)가 있습니다.팬더 데이터 프레임을 플로팅하여 한 열이 각 데이터 포인트의 색이되고 다른 열이 모양이되게 할 수 있습니까?

가능하면 라벨의 한 열과 색상/색상에 해당하는 마커/기호로 다른 수의 라벨 열에 해당하는 시간에 대해 플롯을 작성하고 싶습니다. 따라서 두 개의 범례 키가 필요합니다. 예를 들어

:

Date  | Label1 | Label2 | Sum 
------------|---------|---------|---- 
2017-01-01 | A  | X  | 380 
2017-01-01 | B  | X  | 110 
2017-01-02 | A  | X  | 247 
2017-01-02 | B  | Y  | 278 
2017-01-03 | A  | Y  | 357 
2017-01-03 | B  | X  | 101 
... 

답변

0

좋아하는 방법에 대해?

from itertools import product 

# create your dataframe 
df = pd.DataFrame(
    columns=['Date', 'Label1', 'Label2', 'Sum'], 
    data=[ 
     ['2017-01-01', 'A', 'X', 380], 
     ['2017-01-01', 'B', 'X', 110], 
     ['2017-01-02', 'A', 'X', 247], 
     ['2017-01-02', 'B', 'Y', 278], 
     ['2017-01-03', 'A', 'Y', 357], 
     ['2017-01-03', 'B', 'X', 101]] 
).set_index('Date') 
df.index = pd.DatetimeIndex(df.index) 

# create main axis 
ax = df.plot(y='Sum', style='.') 

# create masks 
A = df['Label1'] == 'A' 
B = df['Label1'] == 'B' 
X = df['Label2'] == 'X' 
Y = df['Label2'] == 'Y' 

# styles 
styles_colors = [ 
    (A, 'b'), # blue 
    (B, 'g'), # green 
] 
styles_shapes = [ 
    (X, '^'), # triangle 
    (Y, 'o'), # circle 
] 

# apply styles on subsets of the data (specified by the masks) 
for (mask1, style1), (mask2, style2) in product(styles_colors, styles_shapes): 
    mask = mask1 & mask2 
    style = style1 + style2 
    df[mask].plot(y='Sum', ax=ax, style=style) 
+1

감사합니다. 지금 커스터마이즈하려고하는 범례 만 누락되었습니다. – Jaydog

관련 문제