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


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.