2017-10-14 6 views
0

파이썬으로 성장 차트를 재현하려고합니다. 기본 데이터는 일 단위로 나이를 사용하지만 2 개월 간격으로 나이 (x) 축을 표시하려고합니다. 이것은 축/라벨링 옵션을 사용하여 순전히 수행 할 수 있습니까? 아니면 계산 된 열을 데이터에 추가해야합니까?스케일을 변경하지 않고 파이 Plot 축의 계산 된 값을 표시합니다.

이것은 자체 학습용이므로 설명은 코드보다 더 환영합니다.

이 내가 가진 무엇 :

# Import the WHO weight-for-age data from Excel 
import pandas 
import matplotlib.pyplot as plt 
import numpy as np 

WHO_WFA = pandas.read_excel("PercentilesData.xlsx", sheetname="WGT_WHO") 

# ... slice the dataframe and plot it 
# steps omitted for brevity 

# Plot with data: 
plt.plot(maleAge, maleP01, maleAge, maleP1, maleAge, maleP3, maleAge, maleP5, maleAge, maleP10, maleAge, maleP15, maleAge, maleP25, maleAge, maleP50, maleAge, maleP75, maleAge, maleP85, maleAge, maleP90, maleAge, maleP95, maleAge, maleP97, maleAge, maleP99, maleAge, maleP999) 

# Set up the axes/labels 
plt.title('Weight-for-Age: male (WHO)') 
plt.xlabel('Age (days)') 
plt.ylabel('Weight (kg)') 
plt.axis([0,1900,0,30]) 
plt.grid(True) 

plt.show() 

WHO Weight-for-age, male

대신, x 축 2 개월 단위 (4, 6, 8, 10, 12의 틱이 있어야합니다 .. ~ 60). 그래도 데이터를 플로팅 한 날이 필요합니다! 따라서 x 축 값 60은 2로 표시되고 120 (일)은 4 (월) 등으로 표시됩니다.

감사합니다!

# month duration 
mo = 30.4375 
# divide age in days by month duration 
plt.plot(maleAge/mo, maleP01, maleAge/mo, maleP1, maleAge/mo, maleP3, maleAge/mo, maleP5, maleAge/mo, maleP10, maleAge/mo, maleP15, maleAge/mo, maleP25, maleAge/mo, maleP50, maleAge/mo, maleP75, maleAge/mo, maleP85, maleAge/mo, maleP90, maleAge/mo, maleP95, maleAge/mo, maleP97, maleAge/mo, maleP99, maleAge/mo, maleP999) 
# Adjust the maximum x value to 60 ... 
plt.axis([0,60,0,30]) 

이 생성 :

WHO WfA chart in months

만큼 x 축 범위 조정과 동일한 곡선을 초래할 않는다 개월 기간에 의해 값을 나누면 : UPDATE 1

마지막 단계는 12 개월마다 큰 눈금과 2 개월마다 작은 눈금을 사용하여 축을 표시하는 방법입니다.

진정한 호기심 : WHO 성장 차트의 월 길이는 30.4375 일로 표준화되었습니다. 데이터는 0에서 1856 일 (60.98 개월 완료)까지 지속됩니다. 매일 (0, 1, ... 1856)에는 각각 다른 백분위 곡선에 해당하는 15 개의 가중치가 있으며 총 27,840 개의 값이 있습니다.

원래 데이터가에서 공개적으로 볼 수 있습니다 : 한 달 30.4375 일이 있다고 가정 WHO data/weight-for-age for boys

+0

이 상기 입력 데이터는 무엇입니까? 월은 일반적으로 28 일에서 31 일 사이이므로 결과가 분명하지 않습니다. – ImportanceOfBeingErnest

+0

성장 차트의 경우 월은 30.4375 일로 간주됩니다. 데이터 범위는 0 ~ 1856 일 (60.98 개월 완료)입니다. 그러나 질문의 ​​목적을 위해 계산에 사용 된 값은 중요하지 않습니다. – pediatrictactic

+1

나이를 30.4375로 나눈 값으로 무엇이 잘못 되었습니까? 'plt.plot (maleAge/30.4375, maleP01, maleAge/30.4375, maleP1, ...)' – ImportanceOfBeingErnest

답변

1

, 당신은 30.4375의 숫자로 일을 나누고 개월 수를 얻을 수 있습니다.

plt.plot(maleAge/30.4375, maleP01, maleAge/30.4375, maleP1, ...) 

는 주요 진드기 (12)의 간격과 마이너 틱 2의 간격으로 matplotlib.ticker.MultipleLocator을 사용할 수 있습니다, 특정 틱 간격을 정의합니다.

import pandas as pd 
import matplotlib.pyplot as plt 
import matplotlib.ticker 
import numpy as np 

#create some dataset 
age = np.arange(0,1857) # in days 
df = pd.DataFrame({"age" : age}) 
for i in range(10): 
    df["maleP{}".format(i)] = (3.8-0.9*(1+2*i/10.))*np.sqrt(age)/4.2 

# Plot with data: 
plt.plot(df["age"]/30.4375, df[["maleP{}".format(i) for i in range(10)]]) 

# Set up the axes/labels 
plt.title('Weight-for-Age: male (WHO)') 
plt.xlabel('Age (months)') 
plt.ylabel('Weight (kg)') 
plt.axis([0,1900/30.4375,0,30]) 
plt.grid(True) 

plt.gca().xaxis.set_major_locator(matplotlib.ticker.MultipleLocator(12)) 
plt.gca().xaxis.set_minor_locator(matplotlib.ticker.MultipleLocator(2)) 

plt.show() 

enter image description here

+0

감사합니다! 그 덕분에 많은 것을 배울 수있었습니다. 내가 링크 한 가이드를 검토하고 이것을 답변으로 표시하겠습니다. – pediatrictactic