построение двух векторов данных на диаграмме рассеяния GGPLOT2 с использованием R
Вопрос
Я экспериментировал с обоими ggplot2
и lattice
для графического отображения панелей данных.У меня небольшие проблемы с тем, чтобы осознать ggplot2
модель.В частности, как построить диаграмму рассеяния с двумя наборами данных на каждой панели:
в lattice
Я мог бы сделать это:
xyplot(Predicted_value + Actual_value ~ x_value | State_CD, data=dd)
и это дало бы мне панель для каждого State_CD с каждым столбцом
Я могу сделать один столбец с ggplot2
:
pg <- ggplot(dd, aes(x_value, Predicted_value)) + geom_point(shape = 2)
+ facet_wrap(~ State_CD) + opts(aspect.ratio = 1)
print(pg)
Чего я не могу понять, так это того, как добавить Actual_value к приведенному выше ggplot.
РЕДАКТИРОВАТЬ Хэдли отметил, что это действительно было бы проще, если бы был воспроизводимый пример.Вот код, который, кажется, работает.Есть ли лучший или более краткий способ сделать это с помощью ggplot?Почему синтаксис добавления еще одного набора точек в ggplot настолько отличается от синтаксиса добавления первого набора данных?
library(lattice)
library(ggplot2)
#make some example data
dd<-data.frame(matrix(rnorm(108),36,3),c(rep("A",24),rep("B",24),rep("C",24)))
colnames(dd) <- c("Predicted_value", "Actual_value", "x_value", "State_CD")
#plot with lattice
xyplot(Predicted_value + Actual_value ~ x_value | State_CD, data=dd)
#plot with ggplot
pg <- ggplot(dd, aes(x_value, Predicted_value)) + geom_point(shape = 2) + facet_wrap(~ State_CD) + opts(aspect.ratio = 1)
print(pg)
pg + geom_point(data=dd,aes(x_value, Actual_value,group=State_CD), colour="green")
Вывод решетки выглядит следующим образом:
(источник: cerebralmastication.com)
и ggplot выглядит так:
(источник: cerebralmastication.com)
Решение
Просто продолжаю то, что предложил Ян:для ggplot2 вам действительно нужно, чтобы все данные по оси Y были в одном столбце, а другой столбец был фактором, указывающим, как вы хотите его украсить.Это легко сделать с помощью melt
.А именно:
qplot(x_value, value,
data = melt(dd, measure.vars=c("Predicted_value", "Actual_value")),
colour=variable) + facet_wrap(~State_CD)
Вот как это выглядит для меня:
(источник: Princeton.edu)
Чтобы получить представление о том, что melt
на самом деле делает, вот голова:
> head(melt(dd, measure.vars=c("Predicted_value", "Actual_value")))
x_value State_CD variable value
1 1.2898779 A Predicted_value 1.0913712
2 0.1077710 A Predicted_value -2.2337188
3 -0.9430190 A Predicted_value 1.1409515
4 0.3698614 A Predicted_value -1.8260033
5 -0.3949606 A Predicted_value -0.3102753
6 -0.1275037 A Predicted_value -1.2945864
Видите ли, он «объединяет» Predicted_value и Actual_value в один столбец, называемый value
и добавляет еще один столбец с именем variable
сообщая вам, из какого столбца оно изначально взято.
Другие советы
Обновлять:несколько лет спустя я почти всегда использую метод Джонатана (через пакет тидыра) с ggplot2.Мой ответ ниже работает в крайнем случае, но быстро становится утомительным, если у вас более 3 переменных.
Я уверен, что у Хэдли будет лучший ответ, но синтаксис другой, потому что ggplot(dd,aes())
синтаксис (я думаю) в первую очередь предназначен для отображения только одной переменной.Для двоих я бы использовал:
ggplot() +
geom_point(data=dd, aes(x_value, Actual_value, group=State_CD), colour="green") +
geom_point(data=dd, aes(x_value, Predicted_value, group=State_CD), shape = 2) +
facet_wrap(~ State_CD) +
theme(aspect.ratio = 1)
Извлечение первого набора точек из ggplot() дает ему тот же синтаксис, что и второй.Я считаю, что с этим легче справиться, потому что синтаксис тот же, и он подчеркивает «грамматику графики», лежащую в основе ggplot2.
возможно, вы просто захотите немного изменить форму своих данных, чтобы у вас была одна переменная оси Y с дополнительной переменной-фактором, указывающей, является ли она прогнозируемой или фактической переменной.
Это что-то вроде того, что вы пытаетесь сделать?
dd<-data.frame(type=rep(c("Predicted_value","Actual_value"),20),y_value=rnorm(40),
x_value=rnorm(40),State_CD=rnorm(40)>0)
qplot(x_value,y_value,data=dd,colour=type,facets=.~State_CD)
ну, после публикации вопроса, с которым я столкнулся эта ветка справки по R возможно, это мне помогло.Похоже, я могу это сделать:
pg + geom_line(data=dd,aes(x_value, Actual_value,group=State_CD), colour="green")
это хороший способ делать что-то?Для меня это странно, потому что добавление второго элемента имеет совершенно другой синтаксис, чем первый.