Побудуйте кілька графіків на одному графіку


78

Я зберігав свої дані у вигляді .csvфайлу з 12 стовпцями. Стовпці з 2 по 11 (з міткою F1, F2, ..., F11) є features. Column oneмістить labelці функції goodабо bad.

Я хотів би скласти графік а boxplotз усіх цих 11 функцій проти label, але окремо на goodабо bad. Поки що мій код:

qplot(Label, F1, data=testData, geom = "boxplot", fill=Label, 
          binwidth=0.5, main="Test") + xlab("Label") + ylab("Features")

Однак це свідчить лише F1проти label.

Моє запитання: Як показати F2, F3, ..., F11проти labelв одному графіку з деякими dodge position? Я нормалізував функції, тому вони знаходяться в однаковому масштабі в межах [0 1].

Дані тесту можна знайти тут . Я намалював щось від руки, щоб пояснити проблему (див. Нижче).

приклад мальованої скриньки


1
(+1) У вашому дописі було все, але не зовсім відформатоване. Я здогадуюсь це був голос проти. Навчіться користуватися параметрами форматування SO! Це вам дуже допоможе. Крім того, замість того, щоб розміщувати посилання в CSV, вам слід використовувати dput(testData)та вставляти висновок сюди, щоб люди могли безпосередньо копіювати / вставляти у свою систему.
— Арун

Дуже дякую, Арун. Я спробую відформатувати свою майбутню публікацію. Я намагався вставити дані, але виявив, що вони містять стільки цифр. Але мені слід створити меншу проблему іграшок.
— Samo Jerom

Відповіді:


118

Ви повинні отримати свої дані у певному форматі, розплавивши їх (див. Нижче, як виглядають розплавлені дані), перш ніж складати графік. Інакше те, що ви зробили, здається нормальним.

require(reshape2)
df <- read.csv("TestData.csv", header=T)
# melting by "Label". `melt is from the reshape2 package. 
# do ?melt to see what other things it can do (you will surely need it)
df.m <- melt(df, id.var = "Label")
> df.m # pasting some rows of the melted data.frame

#     Label variable      value
# 1    Good       F1 0.64778924
# 2    Good       F1 0.54608791
# 3    Good       F1 0.46134200
# 4    Good       F1 0.79421221
# 5    Good       F1 0.56919951
# 6    Good       F1 0.73568570
# 7    Good       F1 0.65094207
# 8    Good       F1 0.45749702
# 9    Good       F1 0.80861929
# 10   Good       F1 0.67310067
# 11   Good       F1 0.68781739
# 12   Good       F1 0.47009455
# 13   Good       F1 0.95859182
# 14   Good       F1 1.00000000
# 15   Good       F1 0.46908343
# 16    Bad       F1 0.57875528
# 17    Bad       F1 0.28938046
# 18    Bad       F1 0.68511766

require(ggplot2)
ggplot(data = df.m, aes(x=variable, y=value)) + geom_boxplot(aes(fill=Label))

boxplot_ggplot2

Редагувати: Я розумію, що вам, можливо, доведеться грати. Ось реалізація цього також:

p <- ggplot(data = df.m, aes(x=variable, y=value)) + 
             geom_boxplot(aes(fill=Label))
p + facet_wrap( ~ variable, scales="free")

ggplot2_faceted

Змінити 2: Як додати x-labels, y-labels, title, змінити legend heading, додати jitter?

p <- ggplot(data = df.m, aes(x=variable, y=value)) 
p <- p + geom_boxplot(aes(fill=Label))
p <- p + geom_jitter()
p <- p + facet_wrap( ~ variable, scales="free")
p <- p + xlab("x-axis") + ylab("y-axis") + ggtitle("Title")
p <- p + guides(fill=guide_legend(title="Legend_Title"))
p 

ggplot2_geom_plot

Редагування 3: Як вирівняти geom_point()точки до центру віконця? Це можна зробити за допомогою position_dodge. Це має спрацювати.

require(ggplot2)
p <- ggplot(data = df.m, aes(x=variable, y=value)) 
p <- p + geom_boxplot(aes(fill = Label))
# if you want color for points replace group with colour=Label
p <- p + geom_point(aes(y=value, group=Label), position = position_dodge(width=0.75))
p <- p + facet_wrap( ~ variable, scales="free")
p <- p + xlab("x-axis") + ylab("y-axis") + ggtitle("Title")
p <- p + guides(fill=guide_legend(title="Legend_Title"))
p 

ggplot2_position_dodge_geom_point


Інше питання: як змінити ярлик x та y ярлик за допомогою цього методу? Наприклад, НЕ використовувати 'значення' та 'змінну'. Дуже дякую.
— Samo Jerom

scale_x_discrete (name = "xxx") + scale_y_continuous (name = "yyy")
— Samo Jerom

Мені цікаво, як додати "додавання необроблених точок даних", накладених на boxplot. Я припускаю використовувати geom_point () або geom_jitter (); однак, як я спробував, пункти накладаються разом і не можуть бути розділені на дві групи, тобто тут добре чи погано.
— Samo Jerom

Дуже дякую за вашу допомогу. Лише останній біт, я хочу накласти необроблені точки даних на boxplot. Я спробував як geom_point (), так і geom_jitter (). Наприклад, коли я використовую geom_point (), точки даних із наборів даних `` хороший '' і `` поганий '' накладаються між собою і відображаються посередині оранжевого та синього вікон, показаних вище. Однак я хочу, щоб необроблені точки накладалися окремо вздовж середньої лінії (вуса) кожної коробки. Вибачте, що ще раз вас турбую, але, будь ласка, допоможіть мені розглянути це питання. Ще раз велике спасибі.
— Samo Jerom

1
1. Щойно помітив, що ця lne p <- p + geom_point (aes (y = value, group = Label), position = position_dodge (width = 0.75)) видає попередження: "ymax не визначено: коригування положення замість y" Знайдено рішення в Інтернеті p <- p + geom_point (aes (ymax = max (value), group = Label), position = position_dodge (width = 0.75)) Однак незрозуміло, чому для "position_dodge" потрібен ymax замість y. Просто примітка для інших людей, які хочуть позбутися попереджень.
— Samo Jerom

22

Використовуючи базову графіку, ми можемо використовувати at =для управління положенням ящика в поєднанні з boxwex =шириною вікон. Перше boxplotтвердження створює порожній сюжет. Потім додайте 2 сліди у наступних двох твердженнях.

Зверніть увагу, що далі ми використовуємо df[,-1]для виключення 1-го (id) стовпця зі значень для побудови графіку. Для різних фреймів даних може знадобитися змінити це значення на підмножину для будь-якого стовпця, що містить дані, які потрібно побудувати.

boxplot(df[,-1], boxfill = NA, border = NA) #invisible boxes - only axes and plot area
boxplot(df[df$id=="Good", -1], xaxt = "n", add = TRUE, boxfill="red", 
  boxwex=0.25, at = 1:ncol(df[,-1]) - 0.15) #shift these left by -0.15
boxplot(df[df$id=="Bad", -1], xaxt = "n", add = TRUE, boxfill="blue", 
  boxwex=0.25, at = 1:ncol(df[,-1]) + 0.15) #shift to the right by +0.15

введіть тут опис зображення

Деякі фіктивні дані:

df <- data.frame(
  id = c(rep("Good",200), rep("Bad", 200)),
  F1 = c(rnorm(200,10,2), rnorm(200,8,1)),
  F2 = c(rnorm(200,7,1),  rnorm(200,6,1)),
  F3 = c(rnorm(200,6,2),  rnorm(200,9,3)),
  F4 = c(rnorm(200,12,3), rnorm(200,8,2)))

20

Оскільки ви не згадуєте про сюжетний пакет, я пропоную тут використовувати Latticeверсію (я думаю, що відповідей ggplot2 більше, ніж решіткових, принаймні, оскільки я тут у SO)

 ## reshaping the data( similar to the other answer)
 library(reshape2)
 dat.m <- melt(TestData,id.vars='Label')
 library(lattice)
 bwplot(value~Label |variable,    ## see the powerful conditional formula 
        data=dat.m,
        between=list(y=1),
        main="Bad or Good")

введіть тут опис зображення


Інше питання: як змінити ярлик x та y ярлик за допомогою цього методу?
— Samo Jerom

@SamoJerom додати , наприклад: ylab="value", xlab="treatment"в bwplot заяву
— agstudy

@agstudy Мені цікаво, як додати "додавання необроблених точок даних", накладених на boxplot. Я припускаю використовувати geom_point () або geom_jitter (); однак, як я спробував, пункти накладаються разом і не можуть бути розділені на дві групи, тобто тут добре чи погано.
— Samo Jerom

12

ggplot версія гратчастої ділянки:

library(reshape2)
library(ggplot2)
df <- read.csv("TestData.csv", header=T)
df.m <- melt(df, id.var = "Label")

ggplot(data = df.m, aes(x=Label, y=value)) + 
         geom_boxplot() + facet_wrap(~variable,ncol = 4)

Ділянка: введіть тут опис зображення


7

Я знаю, що це трохи давнє запитання, але воно теж було у мене, і хоча прийняті відповіді працюють, є спосіб зробити щось подібне, не використовуючи додаткові пакети, такі як ggplot або решітка. Це не зовсім так приємно тим, що бокс-сюжети перекриваються, а не показуються поруч, але:

boxplot(data1[,1:4])
boxplot(data2[,1:4],add=TRUE,border="red")

уявлення про те, що це робить.

Це ставить два набори бокс-сюжетів, другий має контур (без заливки) червоним кольором, а також виділяє червоні кольори. Приємно, що це працює для двох різних кадрів даних, а не намагається їх змінити. Швидкий і брудний спосіб.


4

В основі R :для досягнення цього може бути використаний інтерфейс формули з взаємодіями ( ).

df <- read.csv("~/Desktop/TestData.csv")
df <- data.frame(stack(df[,-1]), Label=df$Label) # reshape to long format

boxplot(values ~ Label:ind, data=df, col=c("red", "limegreen"), las=2)

приклад


Є спосіб огранити скриньку?
— Адам Беллаїш,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.