Marcelo Santana
Marcelo Santana

Reputation: 45

How do I show the "X" axis scale in hours, minutes and seconds?

Data were converted using Python dictionary according to Create a new table in Python user titusarmah99 https://stackoverflow.com/users/8363478/titusarmah99

import datetime
import numpy as np
import seaborn as sb 
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use("ggplot")


%matplotlib inline 


%config InlineBackend.figure_format='svg'}

Reading the Sandvik.log and Iscar.log files.

            data=[]
        with open('Sandvik.log','r') as file:
            for row in file:
                data.append(row.rstrip('\n').split('|'))
        columns =['DateTime','Xload']

        data_dic = []
        for row in data:
            tmp ={}
            tmp['DateTime']=row[0]
            for i in range(1,len(row)-1):
                if row[i] in columns:
                    tmp[row[i]]=row[i+1]
            for c in columns:
                if c not in tmp:
                    tmp[c] = '' #for rows which donot have the property
            data_dic.append(tmp)

            dfs = pd.DataFrame(data_dic)
        print (dfs.dtypes)



    # Reading Iscar.log    

    data=[]
    with open('Iscar.log','r') as file:
        for row in file:
            data.append(row.rstrip('\n').split('|'))
    columns =['DateTime','Xload']

    data_dic = []
    for row in data:
        tmp ={}
        tmp['DateTime']=row[0]
        for i in range(1,len(row)-1):
            if row[i] in columns:
                tmp[row[i]]=row[i+1]
        for c in columns:
            if c not in tmp:
                tmp[c] = '' #for rows which donot have the property
        data_dic.append(tmp)

        dfi = pd.DataFrame(data_dic)
    print (dfi.dtypes) 


    # Converting the Xload and Datetime variables
    dfs['Xload']=pd.to_numeric(dfs.Xload)

    dfs['DateTime']= pd.to_datetime(dfs['DateTime']) 

    dfi['Xload']=pd.to_numeric(dfi.Xload)

    dfi['DateTime']= pd.to_datetime(dfi['DateTime']) 


# removing null data
dfs.dropna(inplace=True)
dfi.dropna(inplace=True)


# Reset the DataFrame
dfs.reset_index(drop=True, inplace=True)
dfi.reset_index(drop=True, inplace=True)

Graphing the Xload variable for the Sandvik DataFrame.

dfs.plot('DateTime', color = "red", figsize = (8, 6))

plt.ylim(0,100) # scale up to 100% for Y axis

# creating subtitles
plt.legend(['Sandvik'], loc='upper left') 
plt.title("Machining Time vs. Xload Power")
plt.xlabel("Machining Time")
plt.ylabel("% in Xload variable")

Dataframe Sandvik Chart

Graphing the Xload variable for the Iscar DataFrame

dfi.plot('DateTime', color = "royalblue", figsize = (8, 6))

plt.ylim(0,100)

# creating subtitles
plt.legend(['Iscar'], loc='upper left') 
plt.title("Machining Time vs Xload Power")
plt.xlabel("Machining Time")
plt.ylabel("% in Xload variable")

Dataframe Iscar Chart

I cannot scale the hour, minute and second to the "X" axis after joining both graphs.

plt.figure(figsize = (10, 6))

for frame in [dfs, dfi]:
    plt.plot(frame['Xload'])


#plt.xlim()
plt.ylim(0,100)

# Criando as legendas
plt.legend(['Sandvik', 'Iscar'], shadow=True, loc='upper left') 
plt.title("Machining Time vs Xload Power")
plt.xlabel("Machining Time")
plt.ylabel("% in Xload variable")

Grouped Charts

I will only use the scale in seconds dt.strftime ('% S'). I need to overlay the graphs (Sandvik and Iscar) and change the ordered X-axis scale every 5 seconds.

dfs['DateTime'] = dfs['DateTime'].dt.strftime('%S') 
dfi['DateTime'] = dfi['DateTime'].dt.strftime('%S')

# overlapping graphics
plt.figure(figsize = (10, 4))
for frame in [dfs, dfi]:
    plt.plot(frame['Xload'])
    plt.legend(['Sandvik', 'Iscar'], loc='upper left') #plot da legend

#plt.xlim()
plt.ylim(0,100)


# using seaborn
x1 = dfs['DateTime']
x2 = dfi['DateTime']
y1 = dfs['Xload']
y2 = dfi['Xload']

f, (ax1, ax2) = plt.subplots(ncols=2, nrows=1, sharey=True, figsize=(10,4))
ax = sns.lineplot(x=x1, y=y1, ax=ax1, color='blue', label='Sardvik', ci=None)
ax = sns.lineplot(x=x2, y=y2, ax=ax2, color='red', label='Iscar', ci=None)

ax1.set_xlim(min(x1), max(x1))
ax2.set_xlim(min(x2), max(x2))
ax1.set_xlabel('Machine Time')
ax2.set_xlabel('Machine Time')
ax1.set_ylabel('% in Xload variable')
ax1.set_xticks(ax1.get_xticks()[::5])
ax2.set_xticks(ax2.get_xticks()[::5])
plt.setp( ax1.xaxis.get_majorticklabels(), rotation=90 )
plt.setp( ax2.xaxis.get_majorticklabels(), rotation=90 )

enter image description here

Upvotes: 2

Views: 4737

Answers (1)

impopularGuy
impopularGuy

Reputation: 867

Please edit the question for adding more information. Try not to post it as answers.

As you may have noticed, the timestamps in Sardvik.log and Iscar.log used for plotting are around 10 minutes apart from each other.

plt.figure(figsize = (20, 6))
for frame in [dfs, dfi]:
    plt.plot(frame['DateTime'],frame['Xload'])

#plt.xlim()
plt.ylim(0,100)

# Criando as legendas
plt.legend(['Sandvik', 'Iscar'], shadow=True, loc='upper left') 
plt.title("Machining Time vs Xload Power")
plt.xlabel("Machining Time")
plt.ylabel("% in Xload variable")

Above code yeilds this plot which preserves the timestamps but doesn't look good. If this solves the problem then its great, but just for sake of better visualization, you can plot them as subplot (see example) or broken axes using seaborn.

# adding these two lines before removing null
dfs['DateTime'] = dfs['DateTime'].dt.strftime('%H:%M:%S.%f') 
dfi['DateTime'] = dfi['DateTime'].dt.strftime('%H:%M:%S.%f')

# using seaborn
x1 = dfs['DateTime']
x2 = dfi['DateTime']
y1 = dfs['Xload']
y2 = dfi['Xload']

f, (ax1, ax2) = plt.subplots(ncols=2, nrows=1, sharey=True, figsize=(10,6))
ax = sns.lineplot(x=x1, y=y1, ax=ax1, color='blue', label='Sardvik', ci=None)
ax = sns.lineplot(x=x2, y=y2, ax=ax2, color='red', label='Iscar', ci=None)

ax1.set_xlim(min(x1), max(x1))
ax2.set_xlim(min(x2), max(x2))
ax1.set_xlabel('Machine Time')
ax2.set_xlabel('Machine Time')
ax1.set_ylabel('% in Xload variable')
ax1.set_xticks(ax1.get_xticks()[::10])
ax2.set_xticks(ax2.get_xticks()[::10])
plt.setp( ax1.xaxis.get_majorticklabels(), rotation=70 )
plt.setp( ax2.xaxis.get_majorticklabels(), rotation=70 )

f.suptitle('Machining Time vs Xload Power')
plt.subplots_adjust(wspace=.01, hspace=0)

Above code gives this

Upvotes: 1

Related Questions