У меня 2 разных вектора:

> x$layer
 [1] 0.40000000 0.26153846 0.28305235 0.21058573 0.37593985 0.29437229
 [7] 0.26306306 0.50982801 0.22368421 0.55715871 0.21241830 0.22757940
[13] 0.09388298 0.31101190 0.36363636 0.11277670 0.41382576 0.23955992
[19] 0.33333333 0.12829324 0.40106952 0.56818182 0.22222222 0.21591746
[25] 0.17647059 0.46190476 0.19523810 0.11502831 0.16916558 0.23270440
[31] 0.17787570 0.47401575

> un$layer
  [1] -0.260869565  0.128649184  0.068607069  0.071428571 -0.166666667
  [6]  0.311011905  0.363636364  0.021739130  0.110389610  0.112776699
 [11]  0.136088710  0.000000000  0.076086957  0.101260937  0.238095238
 [16] -0.466666667 -0.058823529  0.000000000  0.029411765  0.033799534
 [21]  0.060728745 -0.188636364 -0.055555556  0.067910091  0.413825758
 [26]  0.239559920  0.000000000  0.071693989  0.000000000  0.000000000
 [31]  0.000000000  0.014473684 -0.316239316 -0.006666667  0.080000000
 [36]  0.051282051  0.333333333 -0.042553191  0.128293242 -0.042218593
 [41]  0.043262411  0.022435897  0.401069519  0.568181818  0.091419407
 [46] -0.032258065  0.000000000  0.000000000 -0.241258741 -0.088993711
 [51]  0.000000000  0.033043478 -0.044771242 -0.402777778 -0.058823529

Я хочу построить гистограмму с накоплением «x» и «un» с интервалом 0,1 с двумя разными цветами:

h=hist(b$layer, xlab='n',
       breaks=seq(-0.6,0.6,by=0.1), ylim=c(0,40), xaxt='n', main="", col='blue')
h=hist(un$layer, xlab='n', beside=FALSE,
       breaks=seq(-0.6,0.6,by=0.1), ylim=c(0,40), xaxt='n', main="", col='red', add=TRUE)
axis(side=1, at=seq(-0.6,0.6,by=0.1), labels=seq(-0.6,0.6,0.1))

Как построить «un» в верхней части «b»? Похоже, что аргумент: beside = FALSE не работает, как для гистограмм. Хотя я бы предпочел сделать это с базовым пакетом, я не против использовать ggplot2, reshape и т. Д., Если это проще.

0
ToNoY 20 Май 2014 в 19:37

2 ответа

Лучший ответ

Как насчет этого. Во-первых, вот ваши данные в более удобном для копирования / вставки формате.

xlayer <-
c(0.4, 0.26153846, 0.28305235, 0.21058573, 0.37593985, 0.29437229, 
0.26306306, 0.50982801, 0.22368421, 0.55715871, 0.2124183, 0.2275794, 
0.09388298, 0.3110119, 0.36363636, 0.1127767, 0.41382576, 0.23955992, 
0.33333333, 0.12829324, 0.40106952, 0.56818182, 0.22222222, 0.21591746, 
0.17647059, 0.46190476, 0.1952381, 0.11502831, 0.16916558, 0.2327044, 
0.1778757, 0.47401575)
unlayer <-
c(-0.260869565, 0.128649184, 0.068607069, 0.071428571, -0.166666667, 
0.311011905, 0.363636364, 0.02173913, 0.11038961, 0.112776699, 
0.13608871, 0, 0.076086957, 0.101260937, 0.238095238, -0.466666667, 
-0.058823529, 0, 0.029411765, 0.033799534, 0.060728745, -0.188636364, 
-0.055555556, 0.067910091, 0.413825758, 0.23955992, 0, 0.071693989, 
0, 0, 0, 0.014473684, -0.316239316, -0.006666667, 0.08, 0.051282051, 
0.333333333, -0.042553191, 0.128293242, -0.042218593, 0.043262411, 
0.022435897, 0.401069519, 0.568181818, 0.091419407, -0.032258065, 
0, 0, -0.241258741, -0.088993711, 0, 0.033043478, -0.044771242, 
-0.402777778, -0.058823529)

Теперь я объединяю данные в один data.frame и вырезаю данные.

dd <- rbind(data.frame(layer="x", value=xlayer), data.frame(layer="un", value=unlayer))

А затем разделите на ваши конкретные сокращения

mybreaks<-seq(-0.6,0.6,by=0.1)
mybreaknames <- sprintf("%0.2f",diff(mybreaks)/2+mybreaks[-length(mybreaks)])
dd$group = cut(dd$value, breaks=mybreaks)

И теперь я рисую данные

barplot(with(dd, table(layer,group)), beside=F, names.arg=mybreaknames)

И это дает следующий сюжет

stacked histogram

РЕДАКТИРОВАТЬ:

Вот версия с возможно лучшей осью абсцисс.

mybreaks<-seq(-0.6,0.6,by=0.1)
dd$group = cut(dd$value, breaks=mybreaks)

xx<-barplot(with(dd, table(layer,group)), beside=F, xaxt="n", legend=levels(dd$layer))
ats<-xx[-length(xx)]+diff(xx)/2
ats<-c(2*ats[1]-ats[2], ats, 2*ats[length(ats)]-ats[length(ats)-1])
axis(1, at=ats, labels=sprintf("%.1f",mybreaks))

continuous x-axis stacked bar plot

2
MrFlick 20 Май 2014 в 16:55

Вот решение ggplot (с использованием красиво отформатированных данных MrFlick)

library(ggplot2)
dd <- data.frame(obs = c(xlayer, unlayer),
                 dist = c(rep("x", length(xlayer)), rep("un", length(unlayer))))


# Stacked, as requested
ggplot(dd, aes(x = obs, fill = dist)) +
    geom_bar(position = "stack", binwidth = 0.1)

enter image description here

Вы заметите, что порядок наложения противоположен ответу мистера Флика, его можно изменить, переупорядочив коэффициент dist.

# Nice and easy to switch to an overlapped-with-transparency alternative
ggplot(dd, aes(x = obs, fill = dist)) +
    geom_bar(position = "identity", binwidth = 0.1, alpha = 0.6)

enter image description here

Я считаю, что это немного легче читать, и порядок расположения не имеет значения.

2
Gregor Thomas 20 Май 2014 в 16:32