Каков наилучший способ сделать серию диаграмм рассеяния, используя 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?





