Как создать точечный график, где значения находятся в нескольких столбцах? - PullRequest
0 голосов
/ 08 июня 2019

У меня есть кадр данных в Pandas, в котором строки являются наблюдениями в разное время, а каждый столбец является ячейкой размера, где значения представляют количество частиц, наблюдаемых для этой ячейки размера. Так это выглядит следующим образом:

         bin1    bin2    bin3    bin4    bin5
Time1    50      200     30      40      5

Time2    60      60      40      420     700

Time3    34      200     30      67      43

Я хотел бы использовать plotly / cufflinks для создания диаграммы рассеяния, в которой ось x будет представлять собой каждый размерный бин, а ось y будет являться значениями в каждом размерном бин. Там будет три цвета, по одному на каждое наблюдение.

Поскольку у меня больше опыта в Matlab, я пытался индексировать значения с помощью iloc (обратите внимание, что в приведенном ниже примере просто делается попытка построить одно наблюдение):

df.iplot(kind="scatter",theme="white",x=df.columns, y=df.iloc[1,:])

Но я просто получаю сообщение об ошибке: сообщение 0.

Можно ли использовать индексирование при выборе значений x и y в Pandas?

1 Ответ

0 голосов
/ 08 июня 2019

Вместо индексации, я думаю, вам нужно лучше понять, как pandas и matplotlib взаимодействуют друг с другом.

Пойдем по шагам для вашего случая:

  1. Как сказано в документации pandas.DataFrame.plot , нанесенный ряд представляет собой столбец. У вас есть ряд в строке, поэтому вам нужно транспонировать ваш фрейм данных.

  2. Чтобы создать диаграмму рассеяния, вам нужны координаты x и y в разных столбцах, но вам не хватает столбца x, поэтому вам также необходимо создать столбец со значениями x в транспонированном кадре данных.

  3. Очевидно, pandas по умолчанию не меняет цвет при последовательных вызовах на plot (это делает matplotlib), поэтому вам нужно выбрать карту цветов и передать цветовой аргумент, иначе все точки будут иметь того же цвета.

Вот рабочий пример:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

#Here I copied you data in a data.txt text file and import it in pandas as a csv.
#You may have a different way to get your data.
df = pd.read_csv('data.txt', sep='\s+', engine='python')

#I assume to have a column named 'time' which is set as the index, as you show in your post.
df.set_index('time')

tdf = df.transpose() #transpose the dataframe

#Drop the time column from the trasponsed dataframe. time is not a data to be plotted.
tdf = tdf.drop('time')

#Creating x values, I go for 1 to 5 but they can be different.
tdf['xval'] = np.arange(1, len(tdf)+1)

#Choose a colormap and making a list of colors to be used.
colormap = plt.cm.rainbow
colors = [colormap(i) for i in np.linspace(0, 1, len(tdf))]

#Make an empty plot, the columns will be added to the axes in the loop.
fig, axes = plt.subplots(1, 1)
for i, cl in enumerate([datacol for datacol in tdf.columns if datacol != 'xval']):
    tdf.plot(x='xval', y=cl, kind="scatter", ax=axes, color=colors[i])

plt.show()

Это изображение следующего изображения:

plot example

Здесь учебник по выбору цветов в matplotlib.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...