在pyplot轴上显示计算值而不更改比例
我试图在python中重现增长图表。基础数据以天为单位使用年龄,但我希望以2个月的间隔显示年龄(x)轴。这可以完全用轴/标签选项来完成,还是需要将计算列添加到数据中?在pyplot轴上显示计算值而不更改比例
这是为了自学,所以解释比代码更受欢迎。
这是我有:
# 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()
相反,x轴应具有在2个月的增量(2,4,6,8,10,12蜱..至60)。尽管如此,我仍然需要绘制数据。所以60的x轴值应该显示为2,120(天)显示为4(月)等。
谢谢任何帮助!
UPDATE 1: 由月持续时间除以值确实导致相同的曲线,只要x轴范围调整:
# 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])
这产生:
最后一步是如何使用每12个月的主要刻度和每2个月的次要刻度显示轴。
对于真正好奇: 世界卫生组织增长图表中的月份长度标准化为30.4375天。数据从0到1856天(60.98个月完成)。对于每一天(0,1,... 1856),有15个权重值,每个对应不同的百分位数曲线,总共有27,840个值。
原始数据是公开的:WHO data/weight-for-age for boys
假设一个月有30.4375天,你可以通过30.4375数除以天数和获得的月数。
plt.plot(maleAge/30.4375, maleP01, maleAge/30.4375, maleP1, ...)
要定义一个特定周期的时间间隔,则可以使用一个与matplotlib.ticker.MultipleLocator
12的主刻度的间隔和用于次要蜱一个的2间隔。
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()
谢谢!这帮助我学到了很多东西。我会回顾你链接的指南并将其标记为答案。 – pediatrictactic
什么是输入数据到这一点?由于月份一般在28到31天之间,因此目前还不清楚产出应该如何。 – ImportanceOfBeingErnest
对于增长图,一个月被认为是30.4375天。数据范围从0到1856天(60.98个月完成)。就问题而言,计算中使用的值并不重要。 – pediatrictactic
因此,绘制年龄除以30.4375会出现什么问题? 'plt.plot(maleAge/30.4375,maleP01,maleAge/30.4375,maleP1,...)' – ImportanceOfBeingErnest