簡體   English   中英

在pyplot軸上顯示計算值而無需更改比例

[英]Display calculated values on pyplot axis without changing the scale

我正在嘗試在python中重現增長圖表。 基礎數據使用以天為單位的年齡,但我想以2個月為間隔顯示年齡(x)軸。 可以僅使用軸/標簽選項完成此操作,還是需要向數據添加計算列?

這是用於自學,因此解釋比代碼更受歡迎。

這就是我所擁有的:

# 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)滴答。 我仍然需要使用天數繪制的數據! 因此x軸值60應該顯示為2,120(天)顯示為4(月),依此類推。

感謝您的任何幫助!

更新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])

這將產生:

世衛組織WfA圖表數月

最后一步是如何使用每12個月的主要刻度線和每2個月的次要刻度線顯示軸。

對於真正好奇的人:WHO增長圖表中的月長標准為30.4375天。 數據從0到1856天(60.98個完整月)。 對於每天(0、1,... 1856年),有15個權重值,每個權重值均對應於不同的百分位數曲線,總計27,840個值。

原始數據可在以下網站上公開獲得: 世衛組織數據/男童體重

假設一個月有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()

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM