Plottng график для нескольких атрибутов + matplotlib - PullRequest
0 голосов
/ 30 мая 2018

У меня есть данные следующим образом:

efficiency = [{'weights': '25', 'sets': '5', 'time': '8.48', 'machine': 'a'},
 {'weights': '100', 'sets': '25', 'time': '7.43', 'machine': 'a'},
 {'weights': '25', 'sets': '5', 'time': '8.70', 'machine': 'b'},
 {'weights': '100', 'sets': '25', 'time': '7.73', 'machine': 'b'},
 {'weights': '25', 'sets': '5', 'time': '7.14', 'machine': 'c'},
 {'weights': '100', 'sets': '25', 'time': '8.38', 'machine': 'c'},
 {'weights': '25', 'sets': '5', 'time': '6.11', 'machine': 'd'}...]

Обозначает время, необходимое машине в минутах для выполнения задачи с заданными весами и наборами.

Я новичок в matplotlib поэтому не понимаю, как построить график вдоль осей X и Y, как показано на этом графике Graph.

Нет необходимости, чтобы график был похож на этот график.Пожалуйста, предложите любой график, который должен представлять время, необходимое для машины,

В основном, я хочу обозначить time, требуемый для machine для данных weights и sets.Я не понимаю, как представить характеристики (время, машина, вес и наборы)

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Данные выглядят так, как будто бы они хорошо представлены в виде гистограммы, где время показано на оси y.

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame(efficiency) # efficiency as defined in the question
df["time"] = df["time"].astype(float)
piv = df.pivot(columns="machine", index="weights", values="time")
piv.plot(kind="bar")

enter image description here

или по заказу машин

piv = df.pivot(columns="weights", index="machine", values="time")
piv.plot(kind="bar")

enter image description here

0 голосов
/ 30 мая 2018

Учитывая, что данные являются переменными во времени, линейный график подходит им лучше всего.

Честно говоря, я бы сделал предварительную разработку набора данных, если бы я был вами, то, что вам нужно, можно сделать очень просто;создайте массив меток времени отдельно и несколько массивов для каждой машины.Однако я не знаю, насколько вы ограничены, чтобы хранить в данных как есть.

import matplotlib.pylab as plt
import pandas as pd


efficiency = [{'weights': '21', 'sets': '5', 'time': '1', 'machine': 'a'}, 
{'weights': '93', 'sets': '25', 'time': '2', 'machine': 'a'},
{'weights': '53', 'sets': '5', 'time': '1', 'machine': 'b'},
{'weights': '61', 'sets': '25', 'time': '2', 'machine': 'b'},
{'weights': '66', 'sets': '5', 'time': '1', 'machine': 'c'},
{'weights': '90', 'sets': '25', 'time': '2', 'machine': 'c'},
{'weights': '79', 'sets': '5', 'time': '1', 'machine': 'd'},
{'weights': '100', 'sets': '25', 'time': '1', 'machine': 'd'}]



class Efficiency:
    plt.rcParams['figure.figsize'] = (16,6)
    def __init__(self, data):
        self.data = data
        self.machines = []
        self.Timestamp = []
        for i in data:
            setattr(self, 'machine_'+i['machine'], dict(efficiency=[]))
            if not i['machine'] in self.machines: self.machines.append(i['machine'])
            if not i['time'] in self.Timestamp: self.Timestamp.append(i['time'])

    def readData(self):
        for i in self.data:
            getattr(self, 'machine_' + i['machine'])['efficiency'].append(float(i['weights']))

    def plotData(self):
        eff_dict = {}
        for i in self.machines:
            eff_dict['machine ' + i] = getattr(self, 'machine_' + i)['efficiency']
        self.df = pd.DataFrame(eff_dict, index= self.Timestamp)

        self.df.plot()
        plt.grid()
        plt.xticks(fontsize=12, rotation=90)
        plt.tick_params(axis='both', which='major', labelsize=18)
        plt.legend(fontsize=12)
        plt.tight_layout()

        plt.show()
        print(self.df)

test = Efficiency(efficiency)
test.readData()
test.plotData()

это из вашего точного кода;enter image description here

Если данные могут быть определены следующим образом:

import matplotlib.pylab as plt
import pandas as pd
import numpy as np
import datetime

efficiency2 = [{'weights': np.random.uniform(60,100, 10),'sets':np.random.randint(5,25, 10), 'time': np.arange(0,10,1), 'machine': 'a'},\
{'weights': np.random.uniform(60,100, 10), 'sets': np.random.randint(5,25, 10), 'time': np.arange(0,10,1), 'machine': 'b'}]



class Efficiency:
    plt.rcParams['figure.figsize'] = (16,6)
    def __init__(self, data):
        self.data = data
        self.machines = []
        self.Timestamp = []
        for i in data:
            setattr(self, 'machine_'+i['machine'], dict(weight=i['weights'], sets = i['sets']))
            if not i['machine'] in self.machines: self.machines.append(i['machine'])
        self.Timestamp = data[0]['time']


    def plotData(self):
        weight_dict = {}
        for i in self.machines:
            weight_dict['machine ' + i + ' weight'] = getattr(self, 'machine_' + i)['weight']
            weight_dict['machine ' + i + ' sets'] = getattr(self, 'machine_' + i)['sets']
        self.df = pd.DataFrame(weight_dict, index= self.Timestamp)

        self.df.plot()
        plt.grid()
        plt.xticks(fontsize=12, rotation=90)
        plt.tick_params(axis='both', which='major', labelsize=18)
        plt.legend(fontsize=20)
        plt.ylabel('(%)',fontsize=20)
        plt.xlabel('time',fontsize=20)

        plt.show()
        print(self.df)

test = Efficiency(efficiency2)
test.plotData()

Вы получите это: enter image description here

Вы можете иметь две метки y, желаемый формат x_axis и различные свойства, это зависит от того, как вам это нравится.

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