Отображение значений из двух наборов данных для сравнения

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

df
       Name Surname P   R   F   
    0   B   N   0.41    0.76    0.53
    1   B   L   0.62    0.67    0.61
    2   B   SV  0.63    0.53    0.52
    3   B   SG  0.43    0.61    0.53
    4   B   R   0.81    0.51    0.53
    5   T   N   0.32    0.82    0.53
    6   T   L   0.58    0.69    0.62
    7   T   SV  0.67    0.61    0.64
    8   T   SG  0.53    0.63    0.57
    9   T   R   0.74    0.48    0.58

и

data = [['B','N',0.41,0.72,0.51], 
['B','L',0.66,0.67,0.62],
['B','SV',0.63,0.51,0.51],
['B','SG',0.44,0.63,0.51],
['B','R',0.81,0.51,0.62],
['T','N',0.33,0.80,0.47],
['T','L',0.58,0.61,0.63],
['T','SV',0.68,0.61,0.64],
['T','SG',0.53,0.63,0.57],
['T','R',0.74,0.48,0.58]]

df1 = pd.DataFrame(data, columns = ['Name','Surname','P','R','F']) 

Я хотел бы создать график на основе значений F, сохраняя информацию (в легенде/метках) B/T и R,N,L, SV, SG.

Я пробовал с гистограммами, но это не учитывает метки/легенды.

Я ищу что-то вроде этого:

fig, ax = plt.subplots()
ax2 = ax.twinx()

df.plot(x = "Name", y=["F"], ax=ax)
df1.plot(x = "Name", y=["F"], ax=ax2, ls = "--")

Однако при этом отсутствуют этикетки и легенда.

Я также пробовал с:

ax = df.plot()
l = ax.get_lines()
df1.plot(ax=ax, linestyle='--', color=(i.get_color() for i in l))

Но не могу отличить по Имени, Фамилии и датафрейму (по оси x должна быть Фамилия). Также было бы нормально изобразить отдельно значения (P, R и F) следующим образом:

ax = df[['P']].plot()
l = ax.get_lines()
df1[['P']].plot(ax=ax, linestyle='--', color=(i.get_color() for i in l))

Я должен сравнить значения F двух графиков на основе имени и фамилии. Любая помощь будет принята с благодарностью.

Используйте fig.legend возможно..

Scott Boston 25.12.2020 21:37
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
2 612
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Самый простой способ добавить информацию о других параметрах на график — использовать функции, такие как ax.text или ax.annotate, в цикле. Код должен выглядеть так:

fig, ax = plt.subplots()
data1 = ax.bar(20*index, df["F"], bar_width)
data2 = ax.bar(20*index+bar_width, df1["F"],bar_width)

for i in index:
    ax.text(i*20-5,0,df['Surname'][i],)
    ax.text(i*20-5,0.05,df['Name'][i])
    ax.text(i*20+bar_width-5,0,df1['Surname'][i])
    ax.text(i*20+bar_width-5,0.05,df1['Name'][i])
plt.show()

Полезная ссылка: Официальная документация по тексту в графиках Matplotlib

Редактировать: Вероятно похожая проблема: Разный текст в каждой точке

Редактировать 2: Код без индекса:

fig, ax = plt.subplots()
data1 = ax.plot(df["F"])
data2 = ax.plot(df1["F"])

for i in range(1,10):
    ax.text(i,df["F"][i],df['Name'][i]+" "+df['Surname'][i],)
    ax.text(i,df["F"][i],df['Name'][i]+" "+df['Surname'][i],)
plt.show()

@Val появляется предыдущая ошибка, потому что вы, вероятно, не определили переменную с именем index, которая используется для построения графика. Вы можете использовать что-то вроде index = np.arange(n)*bar_width*2, где n — длина ваших данных (10 в вашем случае), а также определить bar_width как ширину столбцов. В matplotlib нет отдельной функции для получения легенды в отдельном окне. Я предлагаю вам переместить текст туда, куда вы хотите. Если вы хотите, чтобы легенда находилась в том же окне, обратитесь к matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.legend.ht‌​ml. Если что-то не работает, вы можете переспросить!

Vedant36 25.12.2020 19:51

index хранит значения x оранжевых столбцов. Но если вы используете линейные графики, вы можете удалить индекс из кода, и код станет data1 = plt.plot(df["F"]);data2 = plt.plot(df1["F"]). И эта другая ошибка, которую вы упомянули, что было сообщением об ошибке?

Vedant36 25.12.2020 20:09

@Val В моем коде используется переменная index в строках 2, 3 и 5. Вам нужно либо определить ее, либо удалить из кода, чтобы избежать ошибки.

Vedant36 25.12.2020 20:28

Вы можете установить параметры цвета и/или формы по-разному для каждой линии. Проверьте документы matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.plot.html для точного использования.

Vedant36 25.12.2020 20:42

Поэтому я не могу добавить какую-либо легенду (например, оранжевая линия = 'df1', синяя линия = 'df'), могу ли я?

V_sqrt 25.12.2020 20:46

да, ты можешь. это просто другая функция: ax.legend(). Документация: matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.legend.ht‌​ml

Vedant36 25.12.2020 20:48

МИУК,

fig, ax = plt.subplots()
ax2 = ax.twinx()

df.plot(x = "Name", y=["F"], ax=ax)
df1.plot(x = "Name", y=["F"], ax=ax2, ls = "--")
fig.legend(loc = "upper right", bbox_to_anchor=(1,1), bbox_transform=ax.transAxes)

Выход:

Другие вопросы по теме