Как мне показать масштаб оси «X» в часах, минутах и ​​секундах в Python? - PullRequest
1 голос
/ 03 ноября 2019

Данные были преобразованы с использованием словаря Python в соответствии с Создание новой таблицы в Python пользователь 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'}

Чтение файлов Sandvik.log и Iscar.log.

            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)

Отображение переменной Xload для фрейма данных Sandvik.

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")

Диаграмма данных в фрейме Sandvik

Отображение переменной Xload для кадра данных Iscar

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")

Диаграмма данных Iscar

Я не могу масштабировать часы, минуты и секунды по оси «X» после объединения обоих графиков.

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")

Сгруппированные графики

Я буду использовать шкалу только в секундах dt.strftime ('% S'). Мне нужно наложить графики (Sandvik и Iscar) и изменить упорядоченную шкалу оси X каждые 5 секунд .

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

1 Ответ

1 голос
/ 05 ноября 2019

Пожалуйста, отредактируйте вопрос для добавления дополнительной информации. Постарайтесь не публиковать его как ответы.

Как вы, возможно, заметили, временные метки в Sardvik.log и Iscar.log, используемые для построения графиков, находятся на расстоянии около 10 минут друг от друга.

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")

Выше кода выдает this plot, который сохраняет временные метки, но выглядит не очень хорошо. Если это решит проблему, то это здорово, но просто для лучшей визуализации, вы можете построить их как подзаговор ( см. Пример ) или ломаные оси, используя 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)

Выше код дает this

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...