Учитывая, что данные являются переменными во времени, линейный график подходит им лучше всего.
Честно говоря, я бы сделал предварительную разработку набора данных, если бы я был вами, то, что вам нужно, можно сделать очень просто;создайте массив меток времени отдельно и несколько массивов для каждой машины.Однако я не знаю, насколько вы ограничены, чтобы хранить в данных как есть.
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()
это из вашего точного кода;
Если данные могут быть определены следующим образом:
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()
Вы получите это: 
Вы можете иметь две метки y, желаемый формат x_axis
и различные свойства, это зависит от того, как вам это нравится.