2015-03-05 20 views
2

У меня есть кадр данных в R, называемый x, который имеет сотни строк. Каждая строка - это человек. У меня две переменные: Height, которая является непрерывной, и Country, что является фактором. Я хочу построить сглаженную гистограмму всех высот людей. Я хочу расслоить его на Country. Я знаю, что я могу сделать это с помощью следующего кода:Стратификация графика плотности различными группами с использованием ggplot2 в R

library(ggplot2) 
ggplot(x, aes(x=Height, colour = (Country == "USA"))) + geom_density() 

Строит всех от США, как один цвет (правда), и все из любой другой страны, другой цвет (ложь). Тем не менее, мне бы очень хотелось, чтобы каждый из США был одним цветом, а все из Омана, Нигерии и Швейцарии - другим цветом. Как мне настроить свой код для этого?

+2

Вы могли бы попробовать создать столбец 'x', который будет что-то вроде:' COUNTRY2 <- IfElse (х $ Страна == "США", "цвет1", IfElse (х $ Страна% в% c («Оман», «Нигерия», «Швейцария»), «color2», «»). Затем используйте этот столбец как цвет. –

+1

Насколько я понимаю, вы хотите, чтобы одна плотность для страны и одного цвета для США и еще один для второго, а затем добавьте ** group = Country ** в функцию aes. –

+0

@PeterDee Что делать, если я хотел бы построить две совершенно разные сглаженные гистограммы на одном и том же участке? Есть ли способ просто построить во-первых, оставьте его на экране, а затем наложите другое на другой цвет? – Alexander

ответ

3

Я сделал некоторые данные для иллюстрации:

head(iris) 
table(iris$Species) 
df <- iris 
df$Species2 <- ifelse(df$Species == "setosa", "blue", 
       ifelse(df$Species == "virginica", "red", "")) 

library(ggplot2) 
p <- ggplot(df, aes(x = Sepal.Length, colour = (Species == "setosa"))) 
p + geom_density() # Your example 

example with true and false

# Now let's choose the other created column 
p <- ggplot(df, aes(x = Sepal.Length, colour = Species2)) 
p + geom_density() + facet_wrap(~Species2) 

example with extra column Редактировать, чтобы избавиться от "стран", которые вы не хотите в сюжете, просто подмножите их из фрейма данных, который вы используете на графике (обратите внимание, что метки с цветами не совпадают точно, но которые могут быть изменены в самом кадре данных):

p <- ggplot(df[df$Species2 %in% c("blue", "red"),], aes(x = Sepal.Length, colour = Species2)) 
p + geom_density() + facet_wrap(~Species2) 

example with filtered data frame И для наложения линий просто вынуть facet_wrap:

p + geom_density() 

example without facet_wrap

+0

Что делать, если я хочу наложить зеленые и синие линии на один и тот же сюжет? И полностью устранить красную линию? (Обращаясь к цветам самих линий) – Alexander

+1

@ Александр проверяет мое редактирование. –

0

Я любил работать через отличный ответ выше. Вот мои моды.

df <- iris 
df$Species2 <- ifelse(df$Species == "setosa", "blue", 
      ifelse(df$Species == "virginica", "red", "")) 
homes2006 <- df 

names(homes2006)[names(homes2006)=="Species"] <- "ownership" 
homes2006a <- as.data.frame(sapply(homes2006, gsub, 
           pattern ="setosa",           replacement = "renters")) 
homes2006b <- as.data.frame(sapply(homes2006a, gsub,          pattern = "virginica", 
         replacement = "home-owners")) 
homes2006c <- as.data.frame(sapply(homes2006b, gsub,          pattern = "versicolor", 
         replacement = "home-owners")) 

##somehow sepal-length became a factor column 
homes2006c[,1] <- as.numeric(homes2006c[,1]) 

library(ggplot2) 

p <- ggplot(homes2006c, aes(x = Sepal.Length, 
      colour = (ownership == "home-owners"))) 

p + ylab("number of households") + 
xlab("monthly income (NIS)") + 
ggtitle("income distribution by home ownership") + 
geom_density() 

enter image description here

Смежные вопросы