我有以下問題。我有這個資料框:
import pandas as pd
import matplotlib.pyplot as plt
data = {'date': ["2021-05-03", "2021-05-04", "2021-05-11", "2021-05-19", "2021-05-19"], 'id_customer': ["5", "7", "8", "5", "3"], 'value_dummy': [1, 0, 1, 1,0]}
df = pd.DataFrame.from_dict(data)
我知道如何繪制value_dummy列中所有變數的直方圖:
df['value_dummy'].value_counts().plot(kind='bar')
plt.show()
但我想要一張帶有三個直方圖的圖表,其中每個直方圖對應一個星期。在這種情況下,我將有“第 1 周”(針對“2021-05-03”和“2021-05-04”的觀察)、“第 2 周”(針對“2021-05-11”的觀察)和“周3”(對于來自“2021-05-19”的所有觀察結果)在水平軸上。以及每周相應的直方圖。請問我該怎么做?
期望的輸出是這樣的:

uj5u.com熱心網友回復:
按周分組并考慮不連續的日期并繪制直方圖的子圖:
import pandas as pd
import matplotlib.pyplot as plt
week1 = pd.date_range(start="2021-05-03", end="2021-05-10")
week2 = pd.date_range(start="2021-05-11", end="2021-05-18")
week3 = pd.date_range(start="2021-05-19", end="2021-05-26")
weeks = [week1, week2, week3]
data = {
'date':
["2021-05-03", "2021-05-04", "2021-05-11", "2021-05-19", "2021-05-19"],
'id_customer': ["5", "7", "8", "5", "3"],
'value_dummy': [1, 0, 1, 1, 0]
}
df = pd.DataFrame.from_dict(data)
df['date'] = pd.to_datetime(df.date)
df.set_index('date', inplace=True)
fig, axes = plt.subplots(ncols=len(weeks), figsize=(15, 3))
axes = list(axes)
for w in weeks:
fig.add_subplot(df.loc[df.index.intersection(w)].plot(kind="hist",
ax=axes.pop()))
plt.tight_layout()
plt.show()

當然,用這么少的資料可視化直方圖真的沒有用……我假設你有一個更大的資料集!
按自定義周分組并繪制單個條形圖
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
week1 = pd.date_range(start="2021-05-03", end="2021-05-10") # , freq="W")
week2 = pd.date_range(start="2021-05-11", end="2021-05-18") # , freq="W")
week3 = pd.date_range(start="2021-05-19", end="2021-05-26") # , freq="W")
weeks = week1.union(week2).union(week3)
df = pd.DataFrame(
np.random.randint(100, size=72),
columns=["value"],
index=pd.MultiIndex.from_product([weeks, ["week1", "week2", "week3"]]),
)
df.unstack().droplevel(0, axis=1).T.plot(kind="bar", legend=False, rot=5, figsize=(10,8), color='b')

uj5u.com熱心網友回復:
這是你必須做的:
import pandas as pd
import matplotlib.pyplot as plt
data = {'date': ["2021-05-03", "2021-05-04", "2021-05-11", "2021-05-19", "2021-05-19"], 'id_customer': ["5", "7", "8", "5", "3"], 'value_dummy': [1, 0, 1, 1,0]}
df = pd.DataFrame.from_dict(data)
fig, axes = plt.subplots(ncols=len(df.columns), figsize=(10,5))
for col, ax in zip(df, axes):
df['formatted_date'] = pd.to_datetime(df['date'])
df['week_of_year'] = df.formatted_date.apply(lambda x: x.weekofyear)
df['week_of_year'].value_counts().sort_index().plot.bar(ax=ax, title=col)
plt.tight_layout()
plt.show()
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/339356.html
標籤:Python matplotlib
