首页 > 解决方案 > 如何在时间轴上以有限的 y 轴居中子图

问题描述

我有一些用于生成事件时间线的代码,但我想添加一个额外的线图,显示每天的销售量。但是当我运行绘图时,时间线会被压缩,Y 轴会扩展到新的绘图。解决这个问题的唯一方法是标准化数量图值,这似乎符合时间线图的 y 轴限制,但理想情况下,我想保留第一张图片中线图的原始值并得到它与第二张图片中的时间线图一起使用,因此它是原始值并正确居中/缩放。数据只是格式化为文本文件,如下所示:Date,Event \n 2021 年 7 月 12 日,事件 1

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd


def GenerateTimeLine2(data, data02, title="Timeline", xaxis_format="%d %b", day_interval=5, figsize=(8, 5)):
    levels = np.array([-5, 5, -3, 3, -1, 1])
    fig, ax = plt.subplots(figsize=figsize)
    # Create the base line
    start = min(data.index)
    stop = max(data.index)
    ax.plot((start, stop), (0, 0), 'k', alpha=.5)
    # Iterate through data annoting each one
    for ii, (idate, iname) in enumerate(data.itertuples()):
        level = levels[ii % 6]
        vert = 'top' if level < 0 else 'bottom'

        ax.scatter(idate, 0, s=100, facecolor='w', edgecolor='k', zorder=9999)
        # Plot a line up to the text
        ax.plot((idate, idate), (0, level), c='r', alpha=.7)
        # Give the text a faint background and align it properly
        ax.text(idate, level, iname,ha='right', va=vert, fontsize=14,
                backgroundcolor=(1., 1., 1., .3))
        
    ax.set(title=title)
    # Set the xticks formatting
    # format xaxis with days intervals
    ax.get_xaxis().set_major_locator(mdates.DayLocator(interval=day_interval))
    ax.get_xaxis().set_major_formatter(mdates.DateFormatter(xaxis_format))
    fig.autofmt_xdate()
    #add in overlay line plot
    #ax.plot(data02)
    #print(ax.axis())
    #min_c = min(data02.values.tolist())
    #max_c = max(data02.values.tolist())
    #ax.set_ylabel(min_c,max_c)
    norm = lambda x: 5*(x-x.min())/(x.max()-x.min())
    ax.set_yticks(norm(data02.values))
    #((data02.values-(min(data02.values.tolist())))/(max(data02.values.tolist())-min(data02.values.tolist()))))
    ax.yaxis.tick_right()
    ax.yaxis.set_major_locator(plt.MaxNLocator(5))
    ax.axes.set_ylabel('Quanitity')
    ax.yaxis.set_label_position("right")
    ax.plot(norm(data02))
    #ax.plot((min_c,max_c), (0, 0), 'k', alpha=.5)
    #print(ax.yaxis)
    # Remove components for a cleaner look
    plt.setp((list(ax.spines.values())), visible=False)#ax.get_yticklabels() + 
    
    return ax

data = pd.read_csv(r'testdata01.txt', parse_dates=True, index_col=0)
data02 = pd.read_csv(r'rap_a.txt', parse_dates=True, index_col=0)
ax = GenerateTimeLine2(data,data02,title='Event Timeline',
                       day_interval=1,figsize=(8,5))
#ax.patch.set_facecolor('gray')
#ax.plot(data02)
plt.show() 

具有正确比例的线图
具有标准化值和居中时间线的线图

标签: pythonpandasmatplotlibplotsubplot

解决方案


推荐阅读