簡體   English   中英

使用日期作為 x 軸制作joyplot/ridgeline plot

[英]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.

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