Python/Matplotlib——按日期划分的日期直方图
我有一份跨越几百年的日期清单。我想制作一个有366个桶的柱状图,一年中的每一天一个,x轴以清晰的方式标记,让我可以看到哪个日期是哪个日期(例如,我预计2月29日会出现下降) 我制作了下面的柱状图,但是容易阅读的X轴日期标签会很棒。下面的代码看起来很麻烦,但却满足了我的需求(没有X轴标签): 如果您能帮助缩短此时间,并使x轴日期更加灵活易读,我们将不胜感激Python/Matplotlib——按日期划分的日期直方图,python,date,datetime,matplotlib,histogram,Python,Date,Datetime,Matplotlib,Histogram,我有一份跨越几百年的日期清单。我想制作一个有366个桶的柱状图,一年中的每一天一个,x轴以清晰的方式标记,让我可以看到哪个日期是哪个日期(例如,我预计2月29日会出现下降) 我制作了下面的柱状图,但是容易阅读的X轴日期标签会很棒。下面的代码看起来很麻烦,但却满足了我的需求(没有X轴标签): 如果您能帮助缩短此时间,并使x轴日期更加灵活易读,我们将不胜感激 更新 我已将以下想法合并到中,生成的输出如下所示: 尝试检查此代码: # import section import pandas as
更新 我已将以下想法合并到中,生成的输出如下所示:
尝试检查此代码:
# import section
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as md
import numpy as np
from datetime import date
from itertools import product
# generate a dataframe like yours
date = [date(2020, m, d).strftime("%B %d") for m, d in product(range(1, 13, 1), range(1, 29, 1))]
value = np.abs(np.random.randn(len(date)))
data = pd.DataFrame({'date': date,
'value': value})
data.set_index('date', inplace = True)
# convert index from str to date
data.index = pd.to_datetime(data.index, format = '%B %d')
# plot
fig, ax = plt.subplots(1, 1, figsize = (16, 8))
ax.bar(data.index,
data['value'])
# formatting xaxis
ax.xaxis.set_major_locator(md.DayLocator(interval = 5))
ax.xaxis.set_major_formatter(md.DateFormatter('%B %d'))
plt.setp(ax.xaxis.get_majorticklabels(), rotation = 90 )
ax.set_xlim([data.index[0], data.index[-1]])
plt.show()
# import section
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as md
import numpy as np
from datetime import date
from itertools import product
from mpl_toolkits.axes_grid1 import host_subplot
import mpl_toolkits.axisartist as AA
# generate a dataframe like yours
date = [date(2020, m, d).strftime("%B %d") for m, d in product(range(1, 13, 1), range(1, 29, 1))]
value = np.abs(np.random.randn(len(date)))
data = pd.DataFrame({'date': date,
'value': value})
data.set_index('date', inplace = True)
# convert index from str to date
data.index = pd.to_datetime(data.index, format = '%B %d')
# prepare days and months axes
fig = plt.figure(figsize = (16, 8))
days = host_subplot(111, axes_class = AA.Axes, figure = fig)
plt.subplots_adjust(bottom = 0.1)
months = days.twiny()
# position months axis
offset = -20
new_fixed_axis = months.get_grid_helper().new_fixed_axis
months.axis['bottom'] = new_fixed_axis(loc = 'bottom',
axes = months,
offset = (0, offset))
months.axis['bottom'].toggle(all = True)
#plot
days.bar(data.index, data['value'])
# formatting days axis
days.xaxis.set_major_locator(md.DayLocator(interval = 10))
days.xaxis.set_major_formatter(md.DateFormatter('%d'))
plt.setp(days.xaxis.get_majorticklabels(), rotation = 0)
days.set_xlim([data.index[0], data.index[-1]])
# formatting months axis
months.xaxis.set_major_locator(md.MonthLocator())
months.xaxis.set_major_formatter(md.DateFormatter('%b'))
months.set_xlim([data.index[0], data.index[-1]])
plt.show()
这给了我一个情节:
我将数据帧的索引从字符串转换为日期,然后通过ax.xaxis.set_major\u locator
和ax.xaxis.set_major\u formatter
方法应用所需的xaxis格式。为了绘图,我使用了
matplotlib
,但将这种方法转换为pylab
应该不难
编辑 如果您希望使用天数和月份的独立刻度,可以添加一个次轴(选中此项),如下代码所示:
# import section
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as md
import numpy as np
from datetime import date
from itertools import product
# generate a dataframe like yours
date = [date(2020, m, d).strftime("%B %d") for m, d in product(range(1, 13, 1), range(1, 29, 1))]
value = np.abs(np.random.randn(len(date)))
data = pd.DataFrame({'date': date,
'value': value})
data.set_index('date', inplace = True)
# convert index from str to date
data.index = pd.to_datetime(data.index, format = '%B %d')
# plot
fig, ax = plt.subplots(1, 1, figsize = (16, 8))
ax.bar(data.index,
data['value'])
# formatting xaxis
ax.xaxis.set_major_locator(md.DayLocator(interval = 5))
ax.xaxis.set_major_formatter(md.DateFormatter('%B %d'))
plt.setp(ax.xaxis.get_majorticklabels(), rotation = 90 )
ax.set_xlim([data.index[0], data.index[-1]])
plt.show()
# import section
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as md
import numpy as np
from datetime import date
from itertools import product
from mpl_toolkits.axes_grid1 import host_subplot
import mpl_toolkits.axisartist as AA
# generate a dataframe like yours
date = [date(2020, m, d).strftime("%B %d") for m, d in product(range(1, 13, 1), range(1, 29, 1))]
value = np.abs(np.random.randn(len(date)))
data = pd.DataFrame({'date': date,
'value': value})
data.set_index('date', inplace = True)
# convert index from str to date
data.index = pd.to_datetime(data.index, format = '%B %d')
# prepare days and months axes
fig = plt.figure(figsize = (16, 8))
days = host_subplot(111, axes_class = AA.Axes, figure = fig)
plt.subplots_adjust(bottom = 0.1)
months = days.twiny()
# position months axis
offset = -20
new_fixed_axis = months.get_grid_helper().new_fixed_axis
months.axis['bottom'] = new_fixed_axis(loc = 'bottom',
axes = months,
offset = (0, offset))
months.axis['bottom'].toggle(all = True)
#plot
days.bar(data.index, data['value'])
# formatting days axis
days.xaxis.set_major_locator(md.DayLocator(interval = 10))
days.xaxis.set_major_formatter(md.DateFormatter('%d'))
plt.setp(days.xaxis.get_majorticklabels(), rotation = 0)
days.set_xlim([data.index[0], data.index[-1]])
# formatting months axis
months.xaxis.set_major_locator(md.MonthLocator())
months.xaxis.set_major_formatter(md.DateFormatter('%b'))
months.set_xlim([data.index[0], data.index[-1]])
plt.show()
它生成了这个图:
尝试检查此代码:
# import section
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as md
import numpy as np
from datetime import date
from itertools import product
# generate a dataframe like yours
date = [date(2020, m, d).strftime("%B %d") for m, d in product(range(1, 13, 1), range(1, 29, 1))]
value = np.abs(np.random.randn(len(date)))
data = pd.DataFrame({'date': date,
'value': value})
data.set_index('date', inplace = True)
# convert index from str to date
data.index = pd.to_datetime(data.index, format = '%B %d')
# plot
fig, ax = plt.subplots(1, 1, figsize = (16, 8))
ax.bar(data.index,
data['value'])
# formatting xaxis
ax.xaxis.set_major_locator(md.DayLocator(interval = 5))
ax.xaxis.set_major_formatter(md.DateFormatter('%B %d'))
plt.setp(ax.xaxis.get_majorticklabels(), rotation = 90 )
ax.set_xlim([data.index[0], data.index[-1]])
plt.show()
# import section
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as md
import numpy as np
from datetime import date
from itertools import product
from mpl_toolkits.axes_grid1 import host_subplot
import mpl_toolkits.axisartist as AA
# generate a dataframe like yours
date = [date(2020, m, d).strftime("%B %d") for m, d in product(range(1, 13, 1), range(1, 29, 1))]
value = np.abs(np.random.randn(len(date)))
data = pd.DataFrame({'date': date,
'value': value})
data.set_index('date', inplace = True)
# convert index from str to date
data.index = pd.to_datetime(data.index, format = '%B %d')
# prepare days and months axes
fig = plt.figure(figsize = (16, 8))
days = host_subplot(111, axes_class = AA.Axes, figure = fig)
plt.subplots_adjust(bottom = 0.1)
months = days.twiny()
# position months axis
offset = -20
new_fixed_axis = months.get_grid_helper().new_fixed_axis
months.axis['bottom'] = new_fixed_axis(loc = 'bottom',
axes = months,
offset = (0, offset))
months.axis['bottom'].toggle(all = True)
#plot
days.bar(data.index, data['value'])
# formatting days axis
days.xaxis.set_major_locator(md.DayLocator(interval = 10))
days.xaxis.set_major_formatter(md.DateFormatter('%d'))
plt.setp(days.xaxis.get_majorticklabels(), rotation = 0)
days.set_xlim([data.index[0], data.index[-1]])
# formatting months axis
months.xaxis.set_major_locator(md.MonthLocator())
months.xaxis.set_major_formatter(md.DateFormatter('%b'))
months.set_xlim([data.index[0], data.index[-1]])
plt.show()
这给了我一个情节:
我将数据帧的索引从字符串转换为日期,然后通过ax.xaxis.set_major\u locator
和ax.xaxis.set_major\u formatter
方法应用所需的xaxis格式。为了绘图,我使用了
matplotlib
,但将这种方法转换为pylab
应该不难
编辑 如果您希望使用天数和月份的独立刻度,可以添加一个次轴(选中此项),如下代码所示:
# import section
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as md
import numpy as np
from datetime import date
from itertools import product
# generate a dataframe like yours
date = [date(2020, m, d).strftime("%B %d") for m, d in product(range(1, 13, 1), range(1, 29, 1))]
value = np.abs(np.random.randn(len(date)))
data = pd.DataFrame({'date': date,
'value': value})
data.set_index('date', inplace = True)
# convert index from str to date
data.index = pd.to_datetime(data.index, format = '%B %d')
# plot
fig, ax = plt.subplots(1, 1, figsize = (16, 8))
ax.bar(data.index,
data['value'])
# formatting xaxis
ax.xaxis.set_major_locator(md.DayLocator(interval = 5))
ax.xaxis.set_major_formatter(md.DateFormatter('%B %d'))
plt.setp(ax.xaxis.get_majorticklabels(), rotation = 90 )
ax.set_xlim([data.index[0], data.index[-1]])
plt.show()
# import section
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as md
import numpy as np
from datetime import date
from itertools import product
from mpl_toolkits.axes_grid1 import host_subplot
import mpl_toolkits.axisartist as AA
# generate a dataframe like yours
date = [date(2020, m, d).strftime("%B %d") for m, d in product(range(1, 13, 1), range(1, 29, 1))]
value = np.abs(np.random.randn(len(date)))
data = pd.DataFrame({'date': date,
'value': value})
data.set_index('date', inplace = True)
# convert index from str to date
data.index = pd.to_datetime(data.index, format = '%B %d')
# prepare days and months axes
fig = plt.figure(figsize = (16, 8))
days = host_subplot(111, axes_class = AA.Axes, figure = fig)
plt.subplots_adjust(bottom = 0.1)
months = days.twiny()
# position months axis
offset = -20
new_fixed_axis = months.get_grid_helper().new_fixed_axis
months.axis['bottom'] = new_fixed_axis(loc = 'bottom',
axes = months,
offset = (0, offset))
months.axis['bottom'].toggle(all = True)
#plot
days.bar(data.index, data['value'])
# formatting days axis
days.xaxis.set_major_locator(md.DayLocator(interval = 10))
days.xaxis.set_major_formatter(md.DateFormatter('%d'))
plt.setp(days.xaxis.get_majorticklabels(), rotation = 0)
days.set_xlim([data.index[0], data.index[-1]])
# formatting months axis
months.xaxis.set_major_locator(md.MonthLocator())
months.xaxis.set_major_formatter(md.DateFormatter('%b'))
months.set_xlim([data.index[0], data.index[-1]])
plt.show()
它生成了这个图:
只需稍微修改一下已接受的答案即可:
locator = md.MonthLocator(bymonthday=(1, 15))
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(md.ConciseDateFormatter(locator))
#plt.setp(ax.xaxis.get_majorticklabels(), rotation = 90 )
ax.set_xlim([data.index[0], data.index[-1]])
plt.show()
只需稍微修改一下已接受的答案即可:
locator = md.MonthLocator(bymonthday=(1, 15))
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(md.ConciseDateFormatter(locator))
#plt.setp(ax.xaxis.get_majorticklabels(), rotation = 90 )
ax.set_xlim([data.index[0], data.index[-1]])
plt.show()
您无法在x轴上安装366根字符串(即使使用
ax.setxticklabels([str(d)表示d,以天为单位],rotation='vertical')
)。你关心数据中的哪些日期/中断?@PaulBrodersen——很好我认为添加带有每周休息的每月标签符合我的要求。在x轴上不能容纳366个字符串(即使使用ax.setxticklabels([str(d)表示d,in days],rotation='vertical')
)。你关心数据中的哪些日期/中断?@PaulBrodersen——很好我认为添加每月一次的标签和每周一次的休息时间符合我的要求。谢谢你的回答——熊猫依赖在这里似乎没有什么作用,你有什么理由包括它吗?我使用了itertools
,numpy
和pandas
仅用于构建与您类似的数据
,如果您使用不同的数据类型,就可以了。它们的播放是通过ax.xaxis
方法完成的,它对你有用吗?我想做的一件事是删除重复的月份标签,并在x轴底部显示“一月-二月-三月-四月-十二月”,并有一组单独的数字标签(每5天,你这样做很好)——你知道如何完成吗?这是一个很好的答案。您可能还想看看简明日期格式化程序,它将月份名称放在月份的第一天,您似乎有两个关键的见解:1)使用twiny
创建第二个x轴,2)充分理解matplotlib的内部结构,将x轴移动到图表的底部。如果你能解释第二部分是如何工作的,那就太好了。我做了一些受你的代码启发的事情,但是使用了一种不同的方法来处理2--它也感觉有点冗长/沉重--请参见下面的要点。有没有更简单的方法?谢谢你的回答——看起来熊猫依赖项在这里并没有起到多大作用,你把它包括进来有什么原因吗?我使用了itertools
、numpy
和pandas
只是为了构建一个像你一样的数据,如果你使用不同的数据类型,就可以了。它们的播放是通过ax.xaxis
方法完成的,它对你有用吗?我想做的一件事是删除重复的月份标签,并在x轴底部显示“一月-二月-三月-四月-十二月”,并有一组单独的数字标签(每5天,你这样做很好)——你知道如何完成吗?这是一个很好的答案。您可能还想看看简明日期格式化程序,它将月份名称放在月份的第一天,您似乎有两个关键的见解:1)使用twiny
创建第二个x轴,2)充分理解matplotlib的内部结构,将x轴移动到图表的底部。如果你能解释第二部分是如何工作的,那就太好了。我做了一些受你的代码启发的事情,但是使用了一种不同的方法来处理2--它也感觉有点冗长/沉重--请参见下面的要点。有没有更简单的方法?