Как нарисовать следующий график в R?И как называются эти типы графиков? - PullRequest
0 голосов
/ 25 ноября 2018

Я пытаюсь представить следующие данные

x <- factor(c(1,2,3,4,5))
x
[1] 1 2 3 4 5
Levels: 1 2 3 4 5
value <- c(10,5,7,4,12)
value
[1] 10  5  7  4 12
y <- data.frame(x, value)
y
  x value
1 1    10
2 2     5
3 3     7
4 4     4
5 5    12

Я хочу преобразовать вышеуказанную информацию в следующее графическое представление

enter image description here

Как называется вышеприведенный тип графиков.Я проверил точечный график, но он складывается только вертикально.

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Это решение отображает наборы из трех гистограмм с огранкой 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')

enter image description here

0 голосов
/ 25 ноября 2018

Следующий код создаст график, аналогичный приведенному в вопросе.
Мне пришлось изменить data.frame, ваш график не подходит для графика с geom_dotplot.Новая переменная z$value представляет собой вектор значений 1:5, каждое из которых повторяется столько раз, сколько value.

library(ggplot2)

value <- c(10, 5, 7, 4, 12)

z <- sapply(value, function(v) c(1, rep(0, v - 1)))
z <- cumsum(unlist(z))
z <- data.frame(value = z)

ggplot(z, aes(x = jitter(value))) +
  geom_dotplot() +
  xlab("value")

enter image description here

...