簡體   English   中英

Matplotlib:y軸歸一化

[英]Matplotlib: y-axis normalised

我有以下數據集

Date              Type        Label
2020-03-20         A            1
2020-03-20         A            0
2020-03-19         B            1
2020-03-17         A            1
2020-03-15         C            0
2020-03-19         A            0
2020-03-20         D            1
2020-03-20         A            1

我想 plot 在多行 plot 中使用歸一化值。 下面的代碼繪制了不同的時間線

import matplotlib.pyplot as plt

fig, ax = plt.subplots(1, figsize=[10,6])

(df.loc[df.Label.eq(1),].groupby(["Date","Type"]).agg({"Type":"count"})
 .unstack(1).droplevel(0,axis=1)
 .fillna(method="ffill")
 .plot(ax=ax, kind="line")
)

但是當我嘗試應用標准化時

column_norm=['Type']
df[column_norm] = df[column_norm].apply(lambda x: (x - x.min()) / (x.max() - x.min()))

它失敗了,返回一個錯誤:

TypeError: 不支持的操作數類型 -: 'str' 和 'str'

當我計算最小值和最大值時。

您能告訴我如何獲得 y 軸歸一化為 1 的 plot 嗎?

根據少量數據樣本以及您在共享的代碼中使用countfillna的方式,我認為您希望計算計數標簽的歸一化/重新縮放后的累積總和等於 1。 以下是如何使用更大的樣本數據集執行此操作的分步示例:

import numpy as np   # v 1.19.2
import pandas as pd  # v 1.1.3

# Create sample dataset
rng = np.random.default_rng(seed=1)  # random number generator
dti = pd.date_range('2020-01-01', '2020-01-31', freq='D')
size = 2*dti.size
dfraw = pd.DataFrame(data=dict(Type = rng.choice(list('ABCD'), size=size),
                               Label = rng.choice([0,1], size=size),
                               Date = rng.choice(dti, size=size)))
dfraw.head()

畫法


您可以使用pivot_table方法簡化 dataframe 的整形。 請注意df.Label.eq(1)掩碼和聚合 function count如何在此處替換為aggfunc='sum' ,這利用了Label是數字的事實:

dfp = dfraw.pivot_table(values='Label', index='Date', columns='Type', aggfunc='sum')
dfp.head()

dfp


然后可以使用apply方法為每個變量計算歸一化/重新縮放的累積和:

dfcs = dfp.apply(lambda x: x.cumsum()/x.sum(), axis=0)
dfcs.head()

dfcs


最后,可以填充 NaN 值,使 plot 中的行連續:

df = dfcs.fillna(method='ffill').fillna(value=0)
df.head()

df


ax = df.plot(figsize=(10,6))

# Format the tick labels using the default tick locations and format legend
ticks = ax.get_xticks()
ticklabels = pd.to_datetime(ticks, unit='D').strftime('%d-%b')
ax.set_xticks(ticks)
ax.set_xticklabels(ticklabels, rotation=0, ha='center')
ax.legend(title='Type', frameon=False);

pandas_line_plot

暫無
暫無

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

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