2012-05-24 1 views
0

О, мудрый: у меня вопрос об использовании geom_linerange(), я надеюсь, что это надежный пример, иллюстрирующий мою проблему.ggplot2- geom_linerange with stat_smooth

b=c(100,110,90,100,120,130,170,150,150,120,140,150,120,90,90,100,40,50,40,40,20,60,30) 
test<-data.frame(a=c(2,2,2,4,4,4,4,6,6,6,6,6,6,8,8,8,10,10,10,10,10,10,10), 
       b=b,c=c(b-15)) 

testMelt <- melt(
    test, 
    id  = c("a"), 
    measured = c("b", "c") 
) 


p <- ggplot(
    aes(
    x = factor(a), 
    y = value, 
    fill= variable 
    ),  
    data = testMelt) + 
    geom_boxplot() + 
      stat_smooth(aes(group=variable,x=factor(a),y=value,fill=factor(variable)),data=testMelt) 

Мой фактический набор данных намного больше, а ящики очень податливы. Я думаю, что я хочу, чтобы geom_linerange() каким-то образом отображал диапазон данных в «b» и «c» при каждом значении «a».

Лучшее, что я придумал это:

p<- p+ geom_linerange(aes(as.factor(a),ymin=min(value),ymax=value,color=variable)) 

Я могу предположить, что «с» значения всегда равны или меньше, чем «Ъ», но если диапазон меньше, это «охватывает это вверх ". Могу ли я каким-то образом дрожать? Есть ли лучшее решение?

ответ

1

Мое понимание вопроса является то, что вы хотите, диапазон линии, чтобы отразить диапазон для комбинации a:b:c.

geom_linerange(aes(as.factor(a),ymin=min(value),ymax=value,color=variable)) будет установить минимальное значение минимального целого набор данных (следовательно, все линии появляются с одинаковым минимальным значением.

Паром решений.

Вычислить минимумы и максимумы себя

test_range <- ddply(testMelt, .(a,variable), summarize, 
        val_min = min(value), val_max = max(value)) 

затем запустить

ggplot(data = testMelt) + 
    geom_boxplot(aes(x = factor(a), y = value, fill = variable)) + 
    stat_smooth(aes(group = variable, x = factor(a), y = value, 
        fill = factor(variable))) + 
    geom_linerange(data = test_range, aes(x = as.factor(a), ymin = val_min, 
        ymax = val_max, color = variable), 
        position = position_dodge(width = 0.3)) 

Или, для альтернативы ящикам/линейному диапазону используйте скрипичный сюжет.

ggplot(data = testMelt) + 
    geom_violin(aes(x = factor(a), y = value, fill = variable)) + 
    stat_smooth(aes(group = variable, x = factor(a), y = value, 
        fill = factor(variable))) 
2

В вашем вызове geom_linerange добавьте дополнительный аргумент position=position_dodge(width=0.3). Вы можете отрегулировать абсолютную ширину, чтобы изменить расстояние между вертикальными линиями.

enter image description here

+0

Благодарим за предложение - не полностью ответит на вопрос, но он может пригодиться позже! – Nan

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