Search code examples
pythonmatplotlibseaborndata-scienceline-plot

Time series data visualization issue


I have a time series data like below where the data consists of year and week. So, the data is from 2014 1st week to 2015 52 weeks.

Time series data

Now, below is the line plot of the above mentioned data

sns line plot

As you can see the x axis labelling is not quite what I was trying to achieve since the point after 201453 should be 201501 and there should not be any straight line and it should not be up to 201499. How can I rescale the xaxis exactly according to Due_date column? Below is the code

rand_products = np.random.choice(Op_2['Sp_number'].unique(), 3)
selected_products = Op_2[Op_2['Sp_number'].isin(rand_products)][['Due_date', 'Sp_number', 'Billing']]

plt.figure(figsize=(20,10))
plt.grid(True)

g = sns.lineplot(data=selected_products, x='Due_date', y='Billing', hue='Sp_number', ci=False, legend='full', palette='Set1');

Solution

  • the issue is because 201401... etc. are read as numbers and that is the reason the line chart has that gap. To fix it, you will need to change the numbers to date format and plot it. As the full data is not available, below is the two column dataframe which has the Due_date in the form of integer YYYYWW. Billing column is a bunch of random numbers. Use the method here to convert the integers to dateformat and plot. The gap will be removed....

    import numpy as np
    import pandas as pd
    import random
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    Due_date = list(np.arange(201401,201454)) #Year 2014
    Due_date.extend(np.arange(201501,201553)) #Year 2915
    Billing = random.sample(range(500, 1000), 105) #billing numbers
    df = pd.DataFrame({'Due_date': Due_date, 'Billing': Billing})
    df.Due_date = df.Due_date.astype(str)
    df.Due_date = pd.to_datetime(df['Due_date']+ '-1',format="%Y%W-%w") #Convert to date
    
    plt.figure(figsize=(20,10))
    plt.grid(True)
    
    ax = sns.lineplot(data=df, x='Due_date', y='Billing', ci=False, legend='full', palette='Set1')
    

    Output graph

    Graph without the gap