Я пытаюсь создать подзаговор, где каждый подзаголовок может иметь разное количество измерений (линий) для построения. Я хотел бы использовать палитру для цветов и правильно получить метки.
В приведенном ниже примере я слишком упрощаю реальные данные, с которыми я имею дело, но этого достаточно, чтобы объяснить структуру.
Вот что я пробовал до сих пор
import collections
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# convenience function to flatten inhomogeneous list
def flatten(l):
for el in l:
if isinstance(el, collections.Iterable) and not isinstance(el, (str, bytes)):
yield from flatten(el)
else:
yield el
# some data
x = np.linspace(0, 2, 100)
linear = x
quadratic = x**2
cubic = x**3
noise = np.random.normal(0, 0.5, 100)
cubic_noise = x**3 + noise
# dataframe
df = pd.DataFrame({'X': x,
'linear': linear,
'quadratic': quadratic,
'cubic': cubic,
'cubic_noise': cubic_noise})
# dictionary with dataframe columns to plot
dict_ = {'Linear' : 'linear',
'Quadratic' : 'quadratic',
'Cubic_and_CubicNoise' : ['cubic', 'cubic_noise']}
keys = list(dict_.keys())
flat_keys = list(flatten(list(dict_.values())))
colourmap = plt.cm.viridis
colours = [colourmap(i) for i in np.linspace(0.05, 0.95, len(flat_keys))]
# do the subplots in a loop
fig, ax = plt.subplots(len(dict_), 1, sharex=True)
xcol = 'X'
for i, a, key in zip(range(len(keys)), ax, keys):
ycols = dict_[key]
a.grid(b=True, which='major', color='#666666', linestyle='-')
a.set_title(key, fontsize=12)
a.plot(df[xcol],
df[ycols],
marker='.',
label=ycols,
c=colourmap((i+1) / float(len(flat_keys))))
a.legend()
plt.xlabel(xcol, fontsize=14)
title_ = 'Subplots with different dimensions to plot'
fig.suptitle(title_, fontsize=14)
fig.set_size_inches(15, 8)
plt.show()
Это дает:
участок
Почти готово, но в диаграмме с несколькими линиями я не могу получить разные цвета (из цветовой карты), и легенда получает список, а не метку. Есть идеи, как это улучшить? Большое спасибо.