"Как показать значение различий между двумя точками данных в Line-plot?" - PullRequest
0 голосов
/ 06 января 2019

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

Я не понимаю, как показать значение разрыва между двумя строками.

Ожидаемый результат:

Expected result

Мой результат:

My output result

dataframe: dataframe image

Мой код:

import seaborn as sns
sns.set()
df_MFgrade4.plot(figsize=(15,8), marker='o', color=('#E8743B', '#5bc0de'))
plt.xlabel("Year", fontsize=14)
plt.ylabel("Average Mathematics Scale Score", fontsize=14)
plt.xticks(df_grade4["Year"].astype(int), size=13)
plt.yticks(df1, size=13)
plt.legend(fontsize=15)
plt.show()

1 Ответ

0 голосов
/ 06 января 2019

Как уже упоминалось в комментариях, вы можете использовать matplotlib.pyplot.fill_between, чтобы получить заполнение между строками. Вы также можете использовать matplotlib.pyplot.text, чтобы добавить нужные метки. Поскольку вы не разместили никакого кода, приведу общий пример для иллюстрации.

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0, 10, 0.1)
ticks = np.arange(0, 10, 0.1)
y1 = np.zeros((len(x)))
y2 = np.zeros((len(x)))
xmax = 0.0
imax = 0
for ii in range(len(x)):
    y1[ii] = 50 * ii - 5 * ii**2
    y2[ii] = 50 * ii - 7 * ii**2
    ticks[ii] = y1[ii]-y2[ii]
    if (y1[ii] < 0.0):
        xmax = x[ii]
        imax = ii
        break
ymax = max(y1)
fig = plt.figure(figsize=(8,4), dpi=300)
plt.plot(x, y1, 'g:')
plt.plot(x, y2, 'b:')
plt.ylim([0, ymax*1.05])
plt.xlim([0, xmax])
plt.fill_between(x, y1, y2, color='grey', alpha='0.3')
print imax
for ii in range(imax):
    plt.text(x[ii], ymax*0.01, ticks[ii])
plt.show()

Matplotlib fill_between example plotting projectile motion

Надписи чуть выше оси x указывают разницу между значениями в каждой точке.

Редактировать

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

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
sns.set(font='Times New Roman')

d = {'Year'  : [1990, 1992, 1996, 2000, 2003, 2005, 2007, 2009, 2011,
                2013, 2015, 2017],
     'Male'  : [214, 221, 224, 227, 236, 239, 241, 241, 241, 242, 241, 241],
     'Female': [213, 219, 223, 224, 233, 237, 239, 239, 240, 241, 239, 239]}

df = pd.DataFrame(d)

male = df['Male'].tolist()
female = df['Female'].tolist()
year = df['Year'].tolist()
ymax = max(male)
ymin = min(female)
fig = plt.figure(figsize=(16,10), dpi=300)

# ymin*0.99 should be changed according to the dataset
for ii in range(len(male)):
    plt.text(year[ii]-0.1, ymin*0.99, male[ii]-female[ii], size=16)

plt.plot(year, male, marker=".", color="#5bc0de")
plt.plot(year, female, marker=".", color="#E8743B")
plt.ylim([ymin*0.985, ymax*1.01])
plt.fill_between(year, male, female, color="grey", alpha="0.3")
plt.yticks(male, size=16)
plt.xticks(year, size=16)
plt.title("Matplotlib fill_between() and text() 
           from pandas.DataFrame example", fontsize=20)
plt.show()

Example using pandas DataFrame

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

...