繁体   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