2013-07-27 2 views
4

Как отличить 4 разных фактора (не используя размер)? Можно ли использовать полые и сплошные точки для различения переменной в ggplot2?Как отличить 4 фактора в ggplot2?

test=data.frame(x=runif(12,0,1), 
    y=runif(12,0,1), 
    siteloc=as.factor(c('a','b','a','b','a','b','a','b','a','b','a','b')), 
    modeltype=as.factor(c('q','r','s','q','r','s','q','r','s','q','r','s')), 
    mth=c('Mar','Apr','May','Mar','Apr','May','Mar','Apr','May','Mar','Apr','May'), 
    yr=c(2010,2011,2010,2011,2010,2011,2010,2011,2010,2011,2010,2011)) 

где x - наблюдения, а y - результаты моделирования, и я хочу сравнить различные версии моделей по нескольким факторам. Благодаря!

ответ

3

Вы можете использовать полые и сплошные точки, but only with certain shapes as described in this answer.

Так, что оставляет вас с fill, colour, shape и alpha как эстетических отображений. Это выглядит уродливо, но вот оно:

ggplot(test, aes(x, y, 
       fill=modeltype, 
       shape=siteloc, 
       colour=mth, 
       alpha=factor(yr) 
       )) + 
geom_point(size = 4) + 
scale_shape_manual(values=21:25) + 
scale_alpha_manual(values=c(0.35,1)) 

Уродливое, но я думаю, это то, о чем вы просили. (Я не потрудился выяснить, что происходит с легендой. - это, очевидно, не отображаются границы правой)

Ugly

Если вы хотите отобразить переменную в виде заказного эстетике (полые и твердые), вам придется пойти немного дальше:

test$fill.type<-ifelse(test$yr==2010,'other',as.character(test$mth)) 
cols<-c('red','green','blue') 

ggplot(test, aes(x, y, 
       shape=modeltype, 
       alpha=siteloc, 
       colour=mth, 
       fill=fill.type 
)) + 
    geom_point(size = 10) + 
    scale_shape_manual(values=21:25) + 
    scale_alpha_manual(values=c(1,0.5)) + 
    scale_colour_manual(values=cols) + 
    scale_fill_manual(values=c(cols,NA)) 

Still ugly

Тем не менее уродливые, но это работает. Я не знаю более чистого способа сопоставления yr с одним цветом, если это 2010 год, и mth, если нет; Я был бы рад, если бы кто-то показал мне более чистый способ сделать это. И теперь гиды (легенда) совершенно ошибочны, но вы можете исправить это вручную.

+0

Кроме того, ни одно из них не пусто. Полые и заполненные будут хорошо работать либо для siteloc, либо для года, потому что это дихотомично. Форма для модели. Игнорируя год на данный момент, я хотел бы заполнить красный квадрат, чтобы указать apr, site a, modeltype q. красный полый квадрат, чтобы указать apr, сайт b, тип модели q. зеленый заполненный круг, чтобы указать мар, сайт a, modeltype r. зеленый полый круг: мар, б, р. зеленый заполнить алмаз: mar, a, s. и т. д. Цвет заливки должен соответствовать цвету границы (при заполнении), или, я полагаю, должен быть белым, когда «пустота». Имеет ли это смысл? – Dominik

+0

@ Dominik Я обновил свой ответ, чтобы отобразить переменные в другую эстетическую (пустоту и твердость). – nograpes

5

Думаю, очень сложно визуально различать/сравнивать значения x и y в соответствии с 4 факторами. Я бы использовал огранку, и я уменьшаю количество факторов, используя, например, interaction.

Вот пример с использованием geom_bar:

enter image description here

set.seed(10) 
library(reshape2) 
test.m <- melt(test,measure.vars=c('x','y')) 
ggplot(test.m)+ 
    geom_bar(aes(x=interaction(yr,mth),y=value, 
       fill=variable),stat='identity',position='dodge')+ 
    facet_grid(modeltype~siteloc) 
+0

Спасибо @agstudy. Чем больше я общаюсь с этим, тем больше мне нравятся эти барграфы (хотя я перевернул facet_grid (site ~ model.type), потому что интермодельное сравнение является важной частью). Во-первых, есть ли способ упорядочить х-ось хронологически, а не в алфавитном порядке? – Dominik

3

мне очень нравится с помощью interaction по agstudy - я бы, наверное попробовать это первый. Но если сохранить вещи без изменений, то:

4 фактора могут быть оборудованы огранкой и 2 осями.Тогда есть 2 метрики х и у: один из вариантов является пузырь диаграмма с обе метрики отличить по цвету или форме, или обоих (добавленной джиттера, чтобы сделать формы меньше, перекрывание):

testm = melt(test, id=c('siteloc', 'modeltype', 'mth', 'yr')) 

# by color 
ggplot(testm, aes(x=siteloc, y=modeltype, size=value, colour=variable)) + 
    geom_point(shape=21, position="jitter") + 
    facet_grid(mth~yr) + 
    scale_size_area(max_size=40) + 
    scale_shape(solid=FALSE) + 
    theme_bw() 

Metrics distinguished by color

#by shape 
testm$shape = as.factor(with(testm, ifelse(variable=='x', 21, 25))) 

ggplot(testm, aes(x=siteloc, y=modeltype, size=value, shape=shape)) + 
    geom_point(position="jitter") + 
    facet_grid(mth~yr) + 
    scale_size_area(max_size=40) + 
    scale_shape(solid=FALSE) + 
    theme_bw() 

enter image description here

# by shape and color 
ggplot(testm, aes(x=siteloc, y=modeltype, size=value, colour=variable, shape=shape)) + 
    geom_point(position="jitter") + 
    facet_grid(mth~yr) + 
    scale_size_area(max_size=40) + 
    scale_shape(solid=FALSE) + 
    theme_bw() 

enter image description here

UPDATE:

Это попытка на основе 1 комментарий от Dominik, чтобы показать, если (х, у) выше или ниже линии 1: 1 и насколько велико отношение х/у или у/х - синий треугольник не является, если х/у> 1, красный круг в противном случае (нет необходимости в melt в данном случае):

test$shape = as.factor(with(test, ifelse(x/y>1, 25, 21))) 
test$ratio = with(test, ifelse(x/y>1, x/y, y/x)) 

ggplot(test, aes(x=siteloc, y=modeltype, size=ratio, colour=shape, shape=shape)) + 
    geom_point() + 
    facet_grid(mth~yr) + 
    scale_size_area(max_size=40) + 
    scale_shape(solid=FALSE) + 
    theme_bw() 

enter image description here

+0

Я думаю, что мне это нравится лучше, чем использование «взаимодействия», но в этом контексте это совершенно бессмысленно. более крупный/меньший не представляет особого интереса, а скорее выше или ниже линии 1: 1. Есть ли легкое преобразование/stat, чтобы сделать круги более значимыми? – Dominik

+0

Другими словами, интерес не в (x, y), а в соотношении x/y, в частности, насколько это> или <1, правильно? – topchef

+0

есть. Я думаю, что у меня есть что-то, что мне нравится, я фактически удалял форму, потому что я нахожу, что круги разных размеров легче сравнивать (с красным = underprediction, blue = overprediction). Есть ли страница, в которой перечислены типы фигур, я не видел ее при просмотре docs.ggplot2.org/current? Кроме того, есть ли что-то менее абстрактное для визуального сравнения? Я нахожу линейное расстояние более интуитивно сравнимым размером. Или, возможно, можно было бы увеличить количество кругов отношения в легенде? Спасибо вам за вашу помощь. – Dominik

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