[英]Make joyplot/ridgeline plot using dates as the x-axis
我正在繪制一個歡樂圖,其中 x 軸是一個日期范圍。 但是,joyplot 只接受作為數字的日期參數...結果,圖表繪制正確,但 x 軸顯示日期為其序列號,這對最終用戶不太友好。
我嘗試了各種方法來格式化軸(比如這個: 為 joyplot 設置 x 軸標簽),但到目前為止都沒有!
如何格式化 x 軸,使其以“mm.yyyy”格式顯示日期(例如:01.2022)?
我正在使用以下數據庫繪制此示例(保存為 .csv 到我的計算機): https ://www.boxofficemojo.com/genre/sg4242469121/?ref_=bo_gs_table_24
表格示例(將其復制並粘貼到 .csv 文件中,將其命名為“示例”,如下面的代碼所示):
標題 | 發布日期 | 日期 | 經銷商 |
---|---|---|---|
超人總動員 2 | 2018 年 6 月 15 日 | 43252 | 華特迪士尼影城電影 |
獅子王 | 2019 年 7 月 19 日 | 43647 | 華特迪士尼影城電影 |
海底總動員2 | 2016 年 6 月 17 日 | 42522 | 華特迪士尼影城電影 |
冰雪奇緣二 | 2019 年 11 月 22 日 | 43770 | 華特迪士尼影城電影 |
史萊克 2 | 2004 年 5 月 19 日 | 38108 | 夢工廠 |
玩具總動員 4 | 2019 年 6 月 21 日 | 43617 | 華特迪士尼影城電影 |
玩具總動員 3 | 2010 年 6 月 18 日 | 40330 | 華特迪士尼影城電影 |
冷凍 | 2013 年 11 月 22 日 | 41579 | 華特迪士尼影城電影 |
寵物的秘密生活 | 2016 年 7 月 8 日 | 42552 | 環球影業 |
卑鄙的我2 | 2013 年 7 月 3 日 | 41456 | 環球影業 |
反了 | 2015 年 6 月 19 日 | 42156 | 華特迪士尼影城電影 |
瘋狂動物城 | 2016 年 3 月 4 日 | 42430 | 華特迪士尼影城電影 |
海底總動員 | 2003 年 5 月 30 日 | 37742 | 華特迪士尼影城電影 |
奴才 | 2015 年 7 月 10 日 | 42186 | 環球影業 |
史萊克三世 | 2007 年 5 月 18 日 | 39203 | 夢工廠 |
獅子王 | 1994 年 6 月 15 日 | 34486 | 華特迪士尼影城電影 |
向上 | 2009 年 5 月 29 日 | 39934 | 華特迪士尼影城電影 |
奴才:格魯的崛起 | 2022 年 7 月 1 日 | 44743 | 環球影業 |
格林奇 | 2018 年 11 月 9 日 | 43405 | 環球影業 |
唱歌 | 2016 年 12 月 21 日 | 42705 | 環球影業 |
怪獸大學 | 2013 年 6 月 21 日 | 41426 | 華特迪士尼影城電影 |
代碼:
import joypy
import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline
df = pd.read_csv(r'C:\Users\Downloads\Example.csv', delimiter=';') #replace file name and directory with your file, created from the table above
print(df.shape)
df.head()
fig, ax = joypy.joyplot(df,
by = 'Distributor',
column='Date',
colormap=cm.autumn,
figsize = (10,6),
fade = True)
輸出圖:
在您提供的鏈接的幫助下,我設法獲得了 x 軸上的日期。 我想在這里詳細介紹一下。
讀取和格式化數據的代碼
由於 joyplot 只接受數字,我將字符串(2018 年 1 月 2 日格式)轉換為日期並將它們放在日期列中。 然后使用序數對數字。 我提到這一點是因為上面的數字略有不同。 應該沒關系...
import joypy
import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline
df = pd.read_excel('example.xlsx') ## Copy pasted data into excel
df['Date'] = pd.to_datetime(df['Release Date'], format = '%b %d, %Y')
df['Date_Number'] = df['Date'].apply(lambda x:x.toordinal())
創建用於軸的數組
這類似於其他 SO 帖子中的內容。 但是,這些數據是從 1991 年到 2023 年的某個時間。因此,對它們進行了硬編碼。 使用 9 個刻度,因為我認為 32 年會很好地融合有 8 個臨時標簽。 此外,使用-12
以便只顯示年份和月份。 我認為所有人都是 Jan,您也可以將其刪除。 會留給你...
# Generate date strings from a manually set start date
numdays = 9
start_date = "01-Jan-1991"
dates = pd.date_range(start = "01-Jan-1991", end ='01-Jan-2023',periods=numdays)
dates = [str(date)[:-12] for date in dates]
繪制圖形並調整軸
與在另一篇文章中一樣,使用 ax[-1] 獲取最后一個軸。 但請注意,我使用set_ticks()
獲取刻度,然后使用set_ticklables()
獲取標簽,最后使用xlim()
設置起點和終點的終點,就像這樣......
fig, ax = joypy.joyplot(df, by = 'Distributor', column='Date_Number',
colormap=matplotlib.cm.autumn, figsize = (10,6), fade = True)
ax[-1].set_xticks(range(numdays))
ax[-1].set_xticklabels(dates)
ax[-1].set_xlim([0, 8])
...結果情節是
首先,請接受我的答案中的 x 軸刻度值可能不正確; 目前尚不清楚ax[-1].get_xticks()
獲得的值表示什么。 假設它代表天,我可以通過以下方式將其更改為日期:由於 maplotlib 中的時間序列是公歷標准,我將其從數字轉換為日期。
df['Release Date'] = pd.to_datetime(df['Release Date'], format='%b %d, %Y')
import joypy
import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from matplotlib import cm
import matplotlib.dates as mdates
%matplotlib inline
fig, ax = joypy.joyplot(df,
by = 'Distributor',
column='Date',
colormap=cm.autumn,
figsize = (10,6),
xrot=45,
fade = True)
print(ax[-1].get_xticks())
new_dates = [mdates.num2date(x + mdates.date2num(np.datetime64('1900-01-01'))) for x in ax[-1].get_xticks()]
new_dates = [t.strftime('%b-%Y') for t in new_dates]
ax[-1].set_xticklabels(new_dates)
fig.show()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.