Как вы сказали, вам нужно интерполировать кривые, чтобы увеличить разрешение. Таким образом, вы можете сохранить известные значения ваших данных, в то же время эффективно сглаживая кривые. Чтобы сделать это, вы можете использовать одномерную интерполяцию scipy: interp1d .
Мы хотим интерполировать большее число x-координат, чем у нас, но проблема в том, что у вас есть строки вместо чисел как независимые переменные ваших left
, right
и concorde
"функций". Чтобы решить эту проблему, мы можем просто отобразить ваш столбец issue
в монотонно увеличивающийся числовой вектор, затем интерполировать в новый вектор с предельными значениями, взятыми из него, и, наконец, сохранить метки x в виде строк.
Обновленный код может быть :
import numpy as np
import pandas as pd
from scipy import interpolate
import matplotlib.pyplot as plt
d = {
'issue': ['end div', 'for trump', 'aisle cross', 'for blm', 'help world',
'service', 'community'],
'right': [1, 1, 1, -1, 1, 1, 1],
'left': [1, -1, 1, 1, 1, 1, 1],
'concord': [4, 0, 4, 0, 4, 4, 4]
}
df = pd.DataFrame.from_dict(d)
x = df['issue'].values
concord = df['concord'].values
left = df['left'].values
right = df['right'].values
n = len(x)
x_map = np.arange(0,n)
dx = 0.1
x_int = np.arange(0, n - 1, dx) # vector where we interpolate
# We create the interpolants our three datasets separately:
f_concord = interpolate.interp1d(x_map, concord, 'quadratic')
f_left = interpolate.interp1d(x_map, left, 'quadratic')
f_right = interpolate.interp1d(x_map, right, 'quadratic')
# And interpolate in the resampled x-coordinates:
concord_int = f_concord(x_int)
left_int = f_left(x_int)
right_int = f_right(x_int)
# Finally, plot the interpolated data:
fig, ax = plt.subplots()
ax.plot(x_int, right_int, lw = 9, alpha = 0.36, label = 'right')
ax.plot(x_int, left_int, lw = 9, alpha = 0.36, label = 'left')
ax.plot(x_int, concord_int, lw = 9, alpha = 0.36, label = 'concord')
ax.set_xlabel('issues')
ax.set_ylabel('score')
# Set the correct xticks
ax.set_xticks(x_map)
ax.set_xticklabels(x)
fig.legend(bbox_to_anchor=(0.7, 0.3), loc='upper left', ncol=1)
fig.show()
Результат: