Как показать тип диаграммы каждой оси Y, чтобы различать сравниваемые факторы - PullRequest
1 голос
/ 04 апреля 2019

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

С помощью самого сайта я смог построить различные категорированные факторы, используя разные типы диаграмм, но каквы можете видеть, что нет способа определить, к какому типу диаграммы относится какой фактор / переменная Chart

Это таблица данных (tm_daily_df) и текущий код

   report_date shift     UTL_R  Head_Count
0   2019-03-17     A  0.669107          39
1   2019-03-18     A  0.602197          69
2   2019-03-19     A  0.568741          72
3   2019-03-20     A  0.552013          78
4   2019-03-21     A  0.585469          57
5   2019-03-22     A  0.635652          61
6   2019-03-23     A  0.602197          51
7   2019-03-17     1  0.828020          16
8   2019-03-17     2  0.585469           8
9   2019-03-17     3  0.526922          15
10  2019-03-18     1  0.618924          30
11  2019-03-18     2  0.610560          20
12  2019-03-18     3  0.577105          19
13  2019-03-19     1  0.610560          28
14  2019-03-19     2  0.602197          26
15  2019-03-19     3  0.468375          18
16  2019-03-20     1  0.543650          33
17  2019-03-20     2  0.552013          26
18  2019-03-20     3  0.552013          19
19  2019-03-21     1  0.577105          22
20  2019-03-21     2  0.585469          19
21  2019-03-21     3  0.602197          16
22  2019-03-22     1  0.593833          26
23  2019-03-22     2  0.685835          20
24  2019-03-22     3  0.635652          15
25  2019-03-23     1  0.577105          23
26  2019-03-23     2  0.627288          16
27  2019-03-23     3  0.602197          12
fig, ax = plt.subplots(figsize=(15,6))
g = sns.lineplot(x='report_date',  y='UTL_R', data=tm_daily_df, ax=ax, hue = 'shift', legend = None,
             marker='o', markersize=10)
ax2 = ax.twinx()
g = sns.barplot(x='report_date',  y='Head_Count', data=tm_daily_df, ax=ax2, hue='shift',alpha=.5)
ax.set_title('Utilization Ratio vs HeadCount')
plt.show()

Я хочу иметь легенду, в которой указано, какой тип диаграммы относится к какому набору данных. В этом случае будет вторичная легенда, которая показывает линию, слово "UTL_R" и квадрат (иливсе, что будет представлять гистограмму) рядом со словом "Head_Count".Я также открыт для любых других идей, которые могут определять применяемые типы диаграмм.Имейте в виду, что этот график является одним из многих из огромного набора переменных, он не является единичным экземпляром.

Может быть, есть способ, которым я могу просто поместить изображение / небольшую таблицу на фигуру, если это невозможно

1 Ответ

0 голосов
/ 04 апреля 2019

tl; dr внизу

Недавно мне также потребовалось реализовать две легенды в проекте.Мой код выглядит примерно так:

def plot_my_data(ax, local_zerog, local_oneg, local_maxg):
    # local_zerog list looks like: [local_zerog_dcmdcl_names, local_zerog_dcmdcl_values, local_zerog_time2double_names, local_zerog_time2double_values]
    # the others are structured the same way as well
    mpl.rcParams["lines.markersize"] = 7
    dcmdcl = ax.scatter(local_zerog[0], local_zerog[1], label='Zero G', facecolors='none', edgecolors='b') #dcmdcl
    ax.scatter(local_oneg[0], local_oneg[1], label="One G", facecolors='none', edgecolors='g')
    ax.scatter(local_maxg[0], local_maxg[1], label="Max G", facecolors='none', edgecolors='r')
    ax.tick_params(axis="x", direction="in", top=False, labeltop=False, labelbottom=True)
    ax.tick_params(axis="y", direction="in", right=True)
    labels = ax.get_xticklabels()
    plt.setp(labels, rotation=90, horizontalalignment='center')
    legend1 = ax.legend(loc=1)
    time2double = ax.scatter(local_zerog[2], local_zerog[3], label='Zero G', marker='s', color='b') #time2double
    ax.scatter(local_oneg[2], local_oneg[3], label="One G", marker='s', color='g')
    ax.scatter(local_maxg[2], local_maxg[3], label="Max G", marker='s', color='r')
    ax.plot(local_oneg[0], [0 for _ in local_oneg[0]], color='k')  # line at 0
    ax.plot(local_oneg[2], [0 for _ in local_oneg[2]], color='k')
    ax.legend([dcmdcl, time2double], ["dcmdcl [%]", "time2double [s]"], loc=2)
    plt.gca().add_artist(legend1)

Где у меня было в основном 6 наборов данных: 3 для dcmdcl и 3 для time2double.Каждый из них имеет свой цвет / форму, поэтому в основном я изобразил все одну фигуру в строках

dcmdcl = ax.scatter(local_zerog[0], local_zerog[1], label='Zero G', facecolors='none', edgecolors='b') #dcmdcl
ax.scatter(local_oneg[0], local_oneg[1], label="One G", facecolors='none', edgecolors='g')
ax.scatter(local_maxg[0], local_maxg[1], label="Max G", facecolors='none', edgecolors='r')
ax.tick_params(axis="x", direction="in", top=False, labeltop=False, labelbottom=True)
ax.tick_params(axis="y", direction="in", right=True)
labels = ax.get_xticklabels()
plt.setp(labels, rotation=90, horizontalalignment='center')
legend1 = ax.legend(loc=1)

, где последняя строка генерирует легенду на основе различных назначенных мной ярлыков.Теперь, чтобы провести различие между формами, я взял один dcmdcl и один time2double и создал другую легенду.Соответствующий код:

dcmdcl = ax.scatter(local_zerog[0], local_zerog[1], label='Zero G', facecolors='none', edgecolors='b') #dcmdcl
time2double = ax.scatter(local_zerog[2], local_zerog[3], label='Zero G', marker='s', color='b') #time2double
ax.legend([dcmdcl, time2double], ["dcmdcl [%]", "time2double [s]"], loc=2)

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

tl; dr

Похоже, у вас уже есть легенда, которую вы хотите для одного из наборов данных, так что теперь вам нужно запустить:

legend1 = ax.legend(['put a series of items you want to describe here'], ['put how you would like to title them (needs to be in same order as previous list)'], loc=2)
plt.gca().add_artist(legend1)

Я думаю, что здесь может быть важен порядок (я нея не помню, когда я сделал это), но если вы заметите, мой заказ:

  • подготовьте какой-нибудь материал
  • legend1 = ax.legend(loc=1), чтобы сделать легенду (еще не подготовлено, простопеременная)
  • заговор больше вещей
  • ax.legend([dcmdcl, time2double], ["dcmdcl [%]", "time2double [s]"], loc=2) (обратите внимание, что это время не назначено переменной)
  • plt.gca().add_artist(legend1) теперь я использую переменную, созданную ранее длянанесите его через add_artist()

Мой код для генерации каждого ax, который передается в мою функцию выше:

fig = plt.figure(figsize=(15, 15))

ax = fig.add_subplot(1, 3, 1)
zerog, oneg, maxg = build_plot_data(lower_mach)
plot_my_data(ax, zerog, oneg, maxg)
ax.set_title("Mach < .7")
...