Який найкращий спосіб створити серію графіків розсіювання за matplotlib
допомогою pandas
кадру даних у Python?
Наприклад, якщо у мене є фрейм даних, 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
, і забарвити кожну точку (або розмір) відповідно до цього значення? Вам доведеться повернутися назад, витягнути значення, що не відрізняються від,col1,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)
Як це можна зробити?
EDIT Відповісти на альбом екіпажу:
Ви кажете, що найкращий спосіб - побудувати кожну умову (наприклад 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
?