Каков наилучший способ сделать серию диаграмм рассеяния, используя matplotlib
из pandas
dataframe в Python?
Например, если у меня есть dataframe df
, который имеет некоторые столбцы, представляющие интерес, я, как правило, преобразовываю все в массивы:
import matplotlib.pylab as plt
# df is a DataFrame: fetch col1 and col2
# and drop na rows if any of the columns are NA
mydata = df[["col1", "col2"]].dropna(how="any")
# Now plot with matplotlib
vals = mydata.values
plt.scatter(vals[:, 0], vals[:, 1])
Проблема с преобразованием всего массива перед построением заключается в том, что он заставляет вас вырваться из фреймов данных.
Рассмотрим эти два случая использования, когда полный график данных необходим для построения:
-
Например, если вы хотите теперь просмотреть все значения
col3
для соответствующих значений, которые вы построили при вызовеscatter
, и покрасить каждую точку (или размер) ее стоимость? Вам нужно будет вернуться назад, вытащить значения не-nacol1,col2
и проверить, что их соответствующие значения.Есть ли способ построения, сохраняя данные? Например:
mydata = df.dropna(how="any", subset=["col1", "col2"]) # plot a scatter of col1 by col2, with sizes according to col3 scatter(mydata(["col1", "col2"]), s=mydata["col3"])
-
Аналогично, представьте, что вы хотите фильтровать или окрашивать каждую точку по-разному в зависимости от значений некоторых ее столбцов. Например. что, если вы хотите автоматически строить метки точек, которые встречаются с определенным обрезанием на
col1, col2
вместе с ними (где метки хранятся в другом столбце df), или покрасить эти точки по-разному, как люди делают с кадрами данных в R Например:mydata = df.dropna(how="any", subset=["col1", "col2"]) myscatter = scatter(mydata[["col1", "col2"]], s=1) # Plot in red, with smaller size, all the points that # have a col2 value greater than 0.5 myscatter.replot(mydata["col2"] > 0.5, color="red", s=0.5)
Как это можно сделать?
РЕДАКТИРОВАТЬ Ответ экипажу:
Вы говорите, что наилучшим способом является построение каждого условия (например, subset_a
, subset_b
) отдельно. Что делать, если у вас много условий, например. вы хотите разбить рассеиватели на 4 типа точек или даже больше, построив каждый в другой форме/цвете. Как вы можете элегантно применять условия a, b, c и т.д. И убедиться, что вы затем задумали "остальное" (вещи не в любом из этих условий) в качестве последнего шага?
Аналогично, в вашем примере, где вы рисуете col1,col2
по-разному на основе col3
, что, если есть значения NA, которые нарушают связь между col1,col2,col3
? Например, если вы хотите построить все значения col2
на основе их значений col3
, но некоторые строки имеют значение NA в col1
или col3
, заставляя вас сначала использовать dropna
. Итак, вы бы сделали:
mydata = df.dropna(how="any", subset=["col1", "col2", "col3")
тогда вы можете построить с помощью mydata
, как вы показываете, - разметку разброса между col1,col2
с использованием значений col3
. Но mydata
будет отсутствовать некоторые точки, которые имеют значения для col1,col2
, но являются NA для col3
, и они все еще должны быть построены... так как бы вы в основном заложили "остальную" информацию, т.е. точки, которые не находятся в отфильтрованном наборе mydata
?