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