【问题标题】:X-axis label at start/end of chart in MatplotlibMatplotlib 中图表开始/结束处的 X 轴标签
【发布时间】:2018-02-23 10:19:25
【问题描述】:

我使用 matplotlib 和 pyplot 在 Python 中创建了温度图,但无法弄清楚如何为 x 轴上的第一个值和最后一个标签添加日期标签。我尝试了 DayLocator 的多次迭代,但无济于事。我想保持实际绘图的范围相同,并希望保持每天的小刻度线与绘图enter image description here 一样,因此线图的开头或结尾没有空白空间。数据从 06/01 到 08/30。这是我的完整代码,除了 06/01 的第一个刻度和 08/30 的最后一个刻度没有显示之外,它完美地绘制:

import csv
import pylab
from datetime import datetime
from matplotlib import pyplot as plt
import matplotlib.dates as mdates

filename ='Summer17.csv'
with open(filename) as f:
   reader = csv.reader(f)
   header_row = next(reader)

dates_list, temperature, dewpoint = [], [], []
for row in reader:
    if len(row) < 4: 
        continue
    datestring = ("2017/{0:}/{1:} {2:}".format(*row))
    date_obj = datetime.strptime(datestring, "%Y/%m/%d %H:%M")
    dates_list.append(date_obj) 
    temp = float(row[3])
    temperature.append(temp)




fig = plt.figure(dpi=128, figsize=(10,6))
ax = fig.add_axes([0.1, 0.1, 0.85, 0.75])
plt.plot(dates_list,temperature, linewidth=0.5, c='red')
plt.xlim(dates_list[1],dates_list[-1])

myFmt = mdates.DateFormatter('%m/%d') 
months = mdates.MonthLocator() 
days1 = mdates.DayLocator(bymonthday=(1,15))   # every Day
dayss = mdates.DayLocator()

ax.xaxis.set_major_formatter(myFmt)
ax.xaxis.set_major_locator(days1)
ax.xaxis.set_minor_locator(dayss)

【问题讨论】:

    标签: python matplotlib plot axis axis-labels


    【解决方案1】:

    如果2017-06-01 实际上是要绘制的列表的一部分,它将被显示。 DayLocator(bymonthday=(1,15)) 设置每个月的第一天和第十五天的刻度,2017-06-01 是一个月的第一天,因此会显示。 (如果不是,2017-06-01 不在列表中。)

    现在的问题可能是 2017-08-30 可能是列表的一部分,但它不是任何一个月的 15 日的 1 日。因此,想法可以是使用DayLocator(bymonthday=(1,15)) 来查找要显示的刻度,但在显示它们之前将额外需要的2017-08-30 添加到位置列表中,并改用FixedLocator

    import matplotlib.pyplot as plt
    import matplotlib.dates as mdates
    import matplotlib.ticker
    import datetime
    import numpy as np
    
    start = datetime.datetime(2017,6,1)
    end = datetime.datetime(2017,8,30)
    dates_list = [start + datetime.timedelta(days=x) for x in range(0, (end-start).days+1)]
    
    temperature = np.cumsum(np.random.randn(len(dates_list)))
    
    myFmt = mdates.DateFormatter('%m/%d') 
    months = mdates.MonthLocator()  
    days = mdates.DayLocator(bymonthday=(1,15))   
    dayss = mdates.DayLocator()
    
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.plot(dates_list,temperature, linewidth=0.5, c='red')
    
    ax.set_xlim(dates_list[0],dates_list[-1])
    
    ax.xaxis.set_major_formatter(myFmt)
    ax.xaxis.set_major_locator(days)
    ax.xaxis.set_minor_locator(dayss)
    
    # add the (2017,8,30) to the ticks
    locs = list(ax.get_xticks())+ [mdates.date2num(datetime.datetime(2017,8,30))]
    locator= matplotlib.ticker.FixedLocator(locs)
    ax.xaxis.set_major_locator(locator)
    
    plt.show()
    

    【讨论】:

    • 我的数据采用 CSV 格式,月份、日期和 HH:MM 有单独的列。我认为我的问题是第一个日期点是 6 1 00:10。我用 6 1 00:00 在列表顶部添加了一列。这仍然没有奏效。所以我在顶部添加了另一列 5 31 23:59,现在它显示了我一直想要的 6/01 值。您能否向我解释为什么会以这种方式发生?谢谢
    • 我明白使用6 1 00:10 不会导致显示6 1,因为它只是过了午夜10 分钟(因此在午夜之后),因此6 1 不是图表的一部分.您可以在上面的代码中使用datetime.datetime(2017,6,1,0,1,0) 进行测试。但是,6 1 00:00 作为数据的一部分,它应该可以工作。或者,您当然可以使用ax.set_xlim(datetime.datetime(2017,6,1),datetime.datetime(2017,8,30)),独立于实际数据,以确保绘图的限制使得要标记的日期包含在图表中。
    猜你喜欢
    • 2022-12-03
    • 2017-08-24
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多