точечная диаграмма с несколькими функциями X и одним Y в Python

Данные в форме:

       x1     x2
data= 2104,    3
      1600,    3
      2400,    3
      1416,    2
      3000,    4
      1985,    4

y= 399900
   329900
   369000
   232000
   539900
   299900

Я хочу построить точечную диаграмму, у которой есть функция 2 X {x1 и x2} и один Y, но когда я пытаюсь

y=data.loc[:'y']
px=data.loc[:,['x1','x2']]
plt.scatter(px,y)

Я получил:

«ValueError: x и y должны быть одного размера».

Итак, я попробовал это:

data=pd.read_csv('ex1data2.txt',names=['x1','x2','y'])
px=data.loc[:,['x1','x2']]
x1=px['x1']
x2=px['x2']
y=data.loc[:'y']
plt.scatter(x1,x2,y)

На этот раз я получил пустой график с полностью окрашенным синим цветом внутри. Я буду очень доволен, если получу руководство


person GAURAV Sharma    schedule 02.12.2019    source источник
comment
просто сделай data.plot.scatter(y='y', x=['x1','x2']).   -  person Quang Hoang    schedule 02.12.2019
comment
я сделал это, но получил ту же ошибку «ValueError: x и y должны быть одного размера» @QuangHoang   -  person GAURAV Sharma    schedule 02.12.2019
comment
парные диаграммы — хороший способ визуализации многомерных данных: seaborn.pydata.org/generated/ seaborn.pairplot.html   -  person Bob Baxley    schedule 02.12.2019


Ответы (3)


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

Но если вы хотите использовать matplotlib, вы можете проверить документацию (https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.scatter.html), и сказано, что X и Y должны быть похожи на массивы. Вместо этого вы передаете список.

Итак, рабочий код выглядит так:

data = pd.read_csv("test.txt", header=None)

data
      0  1       2
0  2104  3  399900
1  1600  3  329900
2  2400  3  369000
3  1416  2  232000
4  3000  4  539900
5  1985  4  299900

data.columns = ["x1", "x2", "y"]

data
     x1  x2       y
0  2104   3  399900
1  1600   3  329900
2  2400   3  369000
3  1416   2  232000
4  3000   4  539900
5  1985   4  299900


# If you call scatter many times and then plt.show() a single image is created
plt.scatter(data["x1"], data["y"])
plt.scatter(data["x2"], data["y"])
plt.show()

Обратите внимание, что если вы хотите иметь данные в формате массива, вы можете сделать data["x1"].values, и он вернет ndarray.

person Federico Andreoli    schedule 02.12.2019
comment
Отлично =) Не могли бы вы отметить ответ как правильный? Так что я получаю немного репутации - person Federico Andreoli; 02.12.2019

Вы можете построить график только с одним x и несколькими y. Вы можете построить разные x на двойной оси:

fig, ax = plt.subplots()
ay = ax.twiny()

ax.scatter(df['x1'], df['y'])
ay.scatter(df['x2'], df['y'], color='r')
plt.show()

Выход:

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

person Quang Hoang    schedule 02.12.2019

Вы можете использовать seaborn с расплавленным фреймом данных. seaborn.scatterplot имеет аргумент hue, который позволяет включать несколько рядов данных.

import seaborn as sns

ax = sns.scatterplot(x='value', hue='series', y='y',
                     data=data.melt(value_vars=['x1', 'x2'], 
                                    id_vars='y',
                                    var_name='series'))

Однако, если ваши значения x настолько разные, вы можете использовать двойные оси, как в ответе @Quang Hoang.

person mcsoini    schedule 02.12.2019