построение двух векторов данных на диаграмме рассеяния GGPLOT2 с использованием R - PullRequest
18 голосов
/ 21 августа 2009

Я экспериментировал как с 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")

Выход решетки выглядит так: alt text
(источник: cerebralmastication.com )

и ggplot выглядит так: alt text
(источник: cerebralmastication.com )

Ответы [ 4 ]

19 голосов
/ 22 августа 2009

Просто следуя предложенному Иэном: для ggplot2 вы действительно хотите, чтобы все элементы оси Y в одном столбце с другим столбцом как фактор, указывающий, как вы хотите его украсить. Это легко сделать с помощью melt. Для остроумия:

qplot(x_value, value, 
      data = melt(dd, measure.vars=c("Predicted_value", "Actual_value")), 
      colour=variable) + facet_wrap(~State_CD)

Вот как это выглядит для меня: alt text
(источник: 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, позволяющий узнать, из какого столбца он изначально пришел.

6 голосов
/ 22 августа 2009

Обновление : через несколько лет я почти всегда использую метод Джонатана (через пакет tidyr ) с 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.

2 голосов
/ 22 августа 2009

Вы можете просто немного изменить форму ваших данных, чтобы у вас была одна переменная по оси 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)
1 голос
/ 22 августа 2009

через некоторое время после публикации вопроса я наткнулся на эту ветку справки R , которая, возможно, помогла мне. Похоже, я могу сделать это:

 pg + geom_line(data=dd,aes(x_value, Actual_value,group=State_CD), colour="green") 

это хороший способ делать вещи? Это странно для меня, потому что добавление второго элемента имеет совершенно другой синтаксис, чем первый.

...