Соответствие цвета легенды полосам на гистограмме python? - PullRequest
0 голосов
/ 27 мая 2020

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

Ниже представлена ​​функция, которую я использую для построения графика, а также изображение графика.

def seaborn_plot(dataset,times):

    sns.set_style('darkgrid')
    sns.set_color_codes("muted")
    data_ = dataset
    time_list = []
    data_list = []

    for i, v in enumerate(data_):
          if data_[i] > 80000:
              data_list.append(('ED={:.2f}'.format(data_[i])))
              time_list.append(("Hour {}:".format(times[i])))


    df = pd.DataFrame(data = {'times_new':time_list,
                              'data_list':data_list})

    red = 'r'
    blue = 'b'
    colors = []
    for i in range(len(data_)):
        if data_[i] > 80000:
            color = red
            colors.append(color)
        else:
            color2 = blue
            colors.append(color2)

    graph = sns.barplot(x=times, y=data_ , palette = colors, label = time_list)
    graph.set_xlabel("Time (Hours)", fontsize = 10, fontweight = 'bold');
    graph.set_ylabel("Euclidean Distance", fontsize = 10, fontweight = 'bold');
    graph.set_ylim([0, 80000])

    leg = mp.gca().legend(labels = df["times_new"] + df["data_list"])  

    return graph

Полученное изображение:

the image of my graph

1 Ответ

1 голос
/ 28 мая 2020

Вы можете l oop через сгенерированные столбцы и использовать столбцы, удовлетворяющие условию, в качестве маркеров легенды. Поскольку seaborn не возвращает список столбцов (в отличие от plt.bars()), столбцы могут быть получены из возвращенного ax (предположим, что другие столбцы еще не нарисованы на том же графике):

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

sns.set_style('darkgrid')
sns.set_color_codes("muted")
data_ = np.random.randint(20000, 100000, 24)
times = np.arange(0, 24)

y_limit = 80000
colors = ['r' if d > y_limit else 'b' for d in data_]

ax = sns.barplot(x=times, y=data_, palette=colors)
ax.set_xlabel("Time (Hours)", fontsize=10, fontweight='bold')
ax.set_ylabel("Euclidean Distance", fontsize=10, fontweight='bold')
ax.set_ylim([0, y_limit])

handles = [bar for bar in graph.containers[0] if bar.get_height() > y_limit]
labels = [f'Hour {"  " if h < 10 else ""}{h}: ED={ed:,.0f}' for ed, h in zip(data_, times) if ed > y_limit]
ax.legend(handles, labels, bbox_to_anchor=[1.02, 1], loc='upper left')
plt.tight_layout()
plt.show()

resulting plot

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

...