Який найкращий спосіб створити серію графіків розсіювання за 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?





