Это решение отображает наборы из трех гистограмм с огранкой x
.Высота столбцов в каждом наборе определяется с использованием остатка от деления value
на 3. Горизонтальный интервал обеспечивается естественным интервалом геом.Вертикальный интервал создается с использованием белых линий сетки.
library(ggplot2)
library(reshape2)
Данные
dataset <- data.frame('x' = 1:5, 'value' = c(10, 5, 7, 4, 12))
Поскольку каждый value
должен быть представлен тремя столбцами, мы добавим 3 столбца в набор данных ираспределите величину value
между ними, используя целочисленное деление:
dataset[, c('col1', 'col2', 'col3')] <- floor(dataset$value / 3)
r <- dataset$value %% 3
dataset[r == 1, 'col1'] <- dataset[dataset$value %% 3 == 1, 'col1'] + 1
dataset[r == 2, c('col1', 'col2')] <- dataset[r == 2, c('col1', 'col2')] + 1
Теперь мы расплавим кадр данных для целей построения:
dataset <- melt(dataset, id.vars = c('x', 'value'))
colnames(dataset)[4] <- 'magnitude' # avoiding colnames conflict
dataset$variable <- as.character(dataset$variable) # column ordering within a facet
Plot
Сначала сделаем обычную гистограммуМы можем переместить метки фасетов в нижнюю часть области графика, используя параметр switch
.
plt <- ggplot(data = dataset)
plt <- plt + geom_col(aes(x=variable, y = magnitude), fill = 'black')
plt <- plt + facet_grid(.~x, switch="both")
Затем мы будем использовать theme_minimal()
и добавим несколько настроек для параметров, которые определяют внешний вид линий сетки.В частности, мы позаботимся о том, чтобы вспомогательные линии сетки XY и основные линии сетки X оставались пустыми, тогда как основные линии сетки Y были белыми и наносились на график поверх данных.
plt <- plt + theme_minimal()
plt <- plt + theme(panel.grid.major.x = element_blank(),
panel.grid.major.y = element_line(colour = "white", size = 1.5),
panel.grid.minor = element_blank(),
panel.ontop = TRUE)
Мы можем добавить value
меток, используя geom_text()
.Мы будем использовать только x
значения из col2
записей, чтобы мы не отображали значение для каждого столбца в каждом наборе (col2
- это средний столбец).
plt <- plt + geom_text(data = dataset[dataset$variable == 'col2', ],
aes(label = value, x = variable, y = magnitude + 0.5))
plt <- plt + theme(axis.text.x=element_blank()) # removing the 'col' labels
plt + xlab('x') + ylab('value')