【问题标题】:Scatter years and month on X axis and days on Y axis在 X 轴上散布年份和月份,在 Y 轴上散布日期
【发布时间】:2017-02-11 15:00:22
【问题描述】:

我有一个这样的日期时间序列(称为日期):

0     2012-06-26
1     2011-02-22
2     2012-06-06
3     2013-02-10
4     2004-01-01
5     2011-01-25
6     2015-11-02

我想用 Y 轴的日期和 X 轴的月份和年份散点图。

我玩过 pyplot.plot_date,但找不到任何解决方案。

它应该类似于this,仅在 Y 轴上带有日期。

有什么建议吗?

【问题讨论】:

  • 不幸的是,目前尚不清楚您要达到的目标。由于您有一个时间序列,而 scatter 需要 x 和 y 输入,因此不清楚哪些数据应该在哪里。也许您选择一个示例并说明时间序列的第一个日期应该如何出现在图表中。问题也没有得到很好的定义:“没有什么对我有用”不是一个充分的问题描述。请确保您已阅读并理解How to Ask 以及如何生成minimal reproducible example。然后edit你的问题相应。
  • 我在某些日期发生了这一系列事件,我想将它们表示为散点图,Y 轴为天,X 轴为月和年。像this 这样的东西,但有几天在 Y

标签: python datetime matplotlib scatter-plot


【解决方案1】:

看看matplotlib,它真的很有用。 这也可能有助于您开始绘图。

    dates = [
    '2012-06-26',
    '2011-02-22',
    '2012-06-06',
    '2013-02-10',
    '2004-01-01',
    '2011-01-25',
    '2015-11-02',
]

year = []
month = []
day = []


# Sorts your data in an useable dataset
def sort_data():
    for i in range(len(dates)):
        extracted_year = dates[i][0:4]
        extracted_year = int(extracted_year)
        year.append(extracted_year)
    for j in range(len(dates)):
        extracted_month = dates[j][5:7]
        extracted_month = int(extracted_month)
        month.append(extracted_month)
    for k in range(len(dates)):
        extracted_day = dates[k][8:10]
        extracted_day = int(extracted_day)
        day.append(extracted_day)

sort_data()

# Just checking if sort_date() worked correctly
print(year)
print(month)
print(day)

【讨论】:

  • matplotlib 是否需要对数据集进行排序?我可以使用 dates.apply(lambda x: x.month) 或 dates.apply(lambda x: x.year) 从中分割月份和年份,因为它是 datetime64 格式。但我不知道如何在 Y 上绘制日期,在 X 上绘制月份和年份。
【解决方案2】:

目前我最好的解决方案是将年份和月份转换为浮点数,将天数转换为 int:

from matplotlib import pyplot
dates = [
 '2012-06-26',
 '2011-02-22',
 '2012-06-06',
 '2013-02-10',
 '2004-01-01',
 '2011-01-25',
 '2015-11-02',]

fig, ax = pyplot.subplots()
ax.scatter(date.apply(lambda x: float(x.strftime('%Y.%m'))),date.apply(lambda x: x.day), marker='o')

【讨论】:

    【解决方案3】:

    由于您的问题对我来说并不完全清楚,我假设您想在最旧和最近的年份之间散点图所有输入日期时间条目(仅从给定的输入中选择)。

    另外,这是我第一次尝试“matplotlib”库。所以,我只是希望下面的答案能引导你达到预期的结果。

    import datetime
    import numpy
    import matplotlib.pyplot as plt
    from matplotlib.dates import MONDAY
    from matplotlib.dates import DateFormatter, MonthLocator, WeekdayLocator
    from matplotlib.dates import date2num
    
    # Input datetime series.
    dt_series = ["2012-06-26", "2011-02-22", "2012-06-06", "2013-02-10", "2004-01-01", "2011-01-25", "2015-11-02"]
    
    mondays = WeekdayLocator(MONDAY)
    months = MonthLocator(range(1, 13), bymonthday=1, interval=6)
    monthsFmt = DateFormatter("%b'%y")
    
    # Loop to create our own X-axis and Y-axis values.
    # mths is for X-axis values, which are months along with year.
    # dates is for Y-axis values, which are dates.
    mths = list()
    dates = list()
    for dt in dt_series:
        mths.append(date2num(datetime.datetime.strptime(dt.replace('-', ''), "%Y%m%d")))
        dates.append(numpy.float64(float(dt.split('-')[2])))
    
    fig, ax = plt.subplots(squeeze=True)
    ax.plot_date(mths, dates, 'o', tz=None, xdate=True, ydate=False)
    ax.xaxis.set_major_locator(months)
    ax.xaxis.set_major_formatter(monthsFmt)
    ax.xaxis.set_minor_locator(mondays)
    ax.autoscale_view()
    ax.grid(True)
    
    fig.autofmt_xdate()
    
    plt.show()
    

    我还建议您浏览我用作参考的以下链接: http://matplotlib.org/examples/pylab_examples/date_demo2.html

    谢谢

    【讨论】:

    • 嗨@MuzZzdY,你试过这个吗?这正是您所要求的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多