2017-12-14 39 views
1

저는 팬더 데이터 프레임을 사용하여 상자 플롯을 만들었으므로 같은 플롯에서 특정 값을 "X"(희망적으로 빨간색을 외칩니다)라고 표시하려고합니다.팬더를 사용하여 Boxplot의 특정 값을 표시하십시오.

일부 데이터 :

df = pd.DataFrame(
[ 
[2, 4, 5, 6, 1], 
[4, 5, 6, 7, 2], 
[5, 4, 5, 5, 1], 
[10, 4, 7, 8, 2], 
[9, 3, 4, 6, 2], 
[3, 3, 4, 4, 1] 
], columns=['a1', 'a2', 'a3', 'a4', 'b']) 

mark_values = pd.DataFrame(
[ 
[2,1], 
[8.25,2] 
], columns=['a1', 'b']) 

df_long = pd.melt(df, "b", var_name="a", value_name="c") 
g = sns.boxplot(x='c', y='a', hue='b', data=df_long, 
palette=sns.color_palette("Blues_d"), orient='h') 
sns.despine(left=True) 

이것은 상자 그림을 생성합니다. 이제 빨간색 십자 표시로 마커를 추가하고 싶습니다. 카테고리 a1, 하위 그룹 을 X가 "4"이고 서브 그룹이 이고 X가 "8.25"인 등으로 표시하고 내 상자 플롯을 유지합니다.

표시된 값은 위에 정의 된 데이터 프레임 mark_values에서 정의하고 저장해야합니다. 예와 같이 :

mark_values 

Out[1]: 
    a1 b 
0 4.00 1 
1 8.25 2 

쉽게 해결할 수있는 방법이 있습니까?

감사 시본 이후

답변

0

text을 사용할 수 있습니다 matplotlib를 사용하여 구축된다

import pandas as pd 
import seaborn as sns 

df = pd.DataFrame(
[ 
[2, 4, 5, 6, 1], 
[4, 5, 6, 7, 2], 
[5, 4, 5, 5, 1], 
[10, 4, 7, 8, 2], 
[9, 3, 4, 6, 2], 
[3, 3, 4, 4, 1] 
], columns=['a1', 'a2', 'a3', 'a4', 'b']) 

mark_values = pd.DataFrame(
[ 
[2,1], 
[8.25,2] 
], columns=['a1', 'b']) 

df_long = pd.melt(df, "b", var_name="a", value_name="c") 
g = sns.boxplot(x='c', y='a', hue='b', data=df_long, 
palette=sns.color_palette("Blues_d"), orient='h') 
sns.despine(left=True) 
g.text(4,0.1,'X', fontsize=50, color='red') 
g.text(8.25,.5,'X', fontsize=50, color='red') 

enter image description here

X 축은 단순히 c의 값입니다. 그러나 get_ylim()으로 작업하여 원하는 출력을 얻을 수도 있습니다. 당신은 또한 균등하게 값을 얻을 수 np.linspace를 사용할 수 있습니다

import numpy as np 
print(g.get_ylim()) 
print(str(g.get_ylim()[0]) + ' is the low value') 
print(str(g.get_ylim()[1]) + ' is the high value') 
print(np.linspace(g.get_ylim()[0], g.get_ylim()[1], 4)) 

또한 하단 왼쪽 'X'의이 X와 Y 축의 정확한 intersaciton에있을 것입니다 있습니다. 그래서 50의 fontsize는 X가 "off"인 것처럼 보이는 곳에 너무 커지게 만듭니다. 'X'가 올바른 위치에 있도록이 값으로 놀아야 할 수도 있습니다. 그러나 당신의 질문에 나는 당신이 X를 얼마나 원했는지 확신 할 수 없습니다.

여기에서 차이점을보십시오. -.08.1이 30의 글꼴 크기에 맞게 조정 된 것으로 보입니다. 녹색의 "X"는 이러한 조정 된 값을 사용하고 있습니다.

g.text(4,2.1666,'X', fontsize=30, color='red') 
g.text(4 - (4*.08) ,2.1666 + (2.1666 * .1),'X', fontsize=30, color='green') 

enter image description here

+1

예, 그 작동,하지만 당신이 매우 구체적인되지 않을 것 곳으로하지만, 실제 마커 ... 'a3'에 마커를 넣고 싶다면 y- 값이 무엇인지 추측해야합니다. 권리? – gussilago

+0

@ gussilago, 제 편집을 확인하십시오. 당신은'get_ylim()'으로 멋질 수 있습니다. 예를 들어'Y' 값을 범주 수로 나눠 그래프의 지점 추정치를 구합니다. 아마 더 우아한 방법이있을 수 있지만,이 테스트는 괜찮습니다. – MattR

0

먼저 I는 "a" 표시된 지정한다 칼럼, 예를 포함하도록 정의 mark_values 것이 합리적 추측 "a1"으로 표시하려면 1을 a 열에 넣으십시오.

 c a b 
0 2.00 1 1 
1 8.25 1 2 

그런 캐터 좌표가 설명하는

y = (a-1)+(b-1.5)*0.4 

주어진다 수평 방향과 수직 방향에 대한 열 C 곳에 마커로서 "X"로 산점도를 그릴 수

  • 1에서 시작하지만, 첫 번째 범주는 0 플롯 모두 b 값 사이
  • 평균 여기 1.5.바 폭의
  • 절반은이 합계에서 0.4

이 제공 :

import matplotlib.pyplot as plt 
import pandas as pd 
import seaborn as sns 


df = pd.DataFrame([[2, 4, 5, 6, 1], 
        [4, 5, 6, 7, 2], 
        [5, 4, 5, 5, 1], 
        [10, 4, 7, 8, 2], 
        [9, 3, 4, 6, 2], 
        [3, 3, 4, 4, 1]], 
       columns=['a1', 'a2', 'a3', 'a4', 'b']) 

mark_values = pd.DataFrame([ [2,1,1], [8.25,1,2], [4,3,2] ], columns=['c',"a",'b']) 
print mark_values 
df_long = pd.melt(df, "b", var_name="a", value_name="c") 

ax = sns.boxplot(x='c', y='a', hue='b', data=df_long, 
       palette=sns.color_palette("Blues_d"), orient='h') 
sns.despine(left=True) 

y = (mark_values["a"].values - 1)+(mark_values["b"].values-1.5)*0.4 
ax.scatter(mark_values["c"].values, y, marker="x", c="red", s=400, lw=6) 

plt.show() 

enter image description here