Построение координат на Python

#python #pandas #numpy #jupyter-notebook #ipython

Вопрос:

мне нужен совет. В моей базе данных у меня есть точки x и точки y в форме:

 df = pd.read_sql_table('table', cnx)
 
ID кривые
1 [(x,y),(x,y),(x,y) и т.д.]
2 [(x,y),(x,y),(x,y) и т.д.]
 type(df['curves']) #pandas.core.series.Series
 

И я хотел бы попробовать построить линейный график.

Я пробую несколько решений. но у меня ничего не получалось.

 data = df['curves']
plt.plot(*zip(*data))
plt.show()
 

или

 data_in_array = np.array(data)
transposed = data_in_array.T
x,y = transposed #but here i got error - not enough values to unpack (expected 2, got 1)
 

Пожалуйста, посоветуйтесь

Ответ №1:

Разнесите столбец списка кривых

 df = df.explode('curves').reset_index()
 

Создайте отдельные столбцы x и y

 df['curves_x'] = df.curves.str[0]
df['curves_y'] = df.curves.str[1]
 

Сюжет с использованием сиборна

 import seaborn as sns
import matplotlib.pyplot as plt

sns.lineplot(data=df, x='curves_x', y='curves_y', hue='id')
plt.show()
 

Чтобы лучше понять, давайте возьмем некоторые примеры данных,

    id                          curves
0   1  [(10, 20), (20, 30), (30, 50)]
1   2  [(10, 10), (20, 40), (30, 20)]
 

Разнесите столбец и сбросьте индекс

    id    curves
0   1  (10, 20)
1   1  (20, 30)
2   1  (30, 50)
3   2  (10, 10)
4   2  (20, 40)
5   2  (30, 20)
 

Создайте столбцы x и y

    id    curves  curves_x  curves_y
0   1  (10, 20)        10        20
0   1  (20, 30)        20        30
0   1  (30, 50)        30        50
1   2  (10, 10)        10        10
1   2  (20, 40)        20        40
1   2  (30, 20)        30        20
 

Сюжет будет выглядеть так

введите описание изображения здесь

Комментарии:

1. Спасибо, что уделили мне время, но у меня это не работает. Когда я просматриваю его, у меня в столбце curves_x : [ и в curves_y : (

2. Перед всем этим убедитесь, что ваш curves столбец имеет тип списка, а не строку. Если это строка (что, по-видимому, так и есть), используйте testdf['curves'] = testdf['curves'].map(ast.literal_eval) и import ast тоже @Cesc

3. когда я это делаю, я получаю сообщение об ошибке: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy self._set_item(key, value)

4. Используйте df.loc[:, 'curves'] = df['curves'].map(ast.literal_eval) @Cesc

5. по-прежнему ничего — ValueError: malformed node or string: [(0, 4.579), (0.2153549, 9.862635), (0.4196396, 9.862635), (0.6154251, 9.069808), (0.8132706, 22.54274), (1.012405, 20.9576), (1.210602, 21.57384), (1.409637, 23.24702), (1.61058, 21.92599), (1.80954, 25.53644), (2.008942, 24.9202), (2.20961, 22.63078), (2.410034, 25.36037), (2.609161, 22.63078), (2.80925, 23.33506), (2.929764, 24.48002), (3.129486, 29.58708), (3.328705, 32.22915), (3.529053, 37.3362), (3.729904, 33.28557), (3.928864, 30.82008), (4.128937, 28.79476), (4.330307, 26.50534)......]