Создание дискретных бинов на непрерывной оси x с помощью ggplot

Я нашел похожие вопросы, но, к сожалению, ни один из них не помог мне решить эту проблему.

Я хочу заменить непрерывные метки оси x в соответствии с коэффициентом, используя ggplots.

С некоторой помощью SO изображение ниже настолько близко, насколько я смог. Это почти правильно, однако я хотел бы удалить ноль в крайнем левом углу оси x и центрировать остальные метки на оси x в соответствующих ячейках.

nearly_there

Код, используемый для его создания:

library(ggplot)

test_base_breaks_x <- function(x){
  b <- pretty(x)
  d <- data.frame(y=-Inf, yend=-Inf, x=min(b), xend=max(b))
  list(geom_segment(data=d, aes(x=x, y=y, xend=xend, yend=yend), inherit.aes=TRUE),
       scale_x_continuous(breaks=c(0,4,8,10), labels =c("0","a","b","c")))
}

test_base_breaks_y <- function(x){
  b <- pretty(x)
  d <- data.frame(x=-Inf, xend=-Inf, y=min(b), yend=max(b))
  list(geom_segment(data=d, aes(x=x, y=y, xend=xend, yend=yend), inherit.aes=TRUE),
       scale_y_continuous(breaks=b))
}


test <- data.frame(names=c("a","a","a","a","b","b","b","b","c","c"),position=c(1,2,3,4,5,6,7,8,9,10),value=c(10,12,14,12,6,7,7,5,18,20))
test_plot <- ggplot(test, aes(position,value))
test_plot <- test_plot +geom_line()
test_plot <- test_plot + test_base_breaks_x(test$position)
test_plot <- test_plot + test_base_breaks_y(test$value)
jpeg("test.jpg")
test_plot
dev.off()

Заранее спасибо за помощь!

0
0
981
1

Ответы 1

Могу я порекомендовать немного другой подход

library(tidyverse)
data.frame(names=c("a","a","a","a","b","b","b","b","c","c"),
        position=c(1,2,3,4,5,6,7,8,9,10),
        value=c(10,12,14,12,6,7,7,5,18,20)) -> test

Сначала вы можете сделать основной рисунок фигуры

test %>% 
  ggplot(aes(position, value)) + geom_line()

Затем добавьте цвет, чтобы показать свои группы

test %>% 
  ggplot(aes(position, value, color = names)) + geom_line()

Сделайте их единой группой, чтобы соединить линию

test %>% 
  ggplot(aes(position, value, color = names, group = 1)) + geom_line()

Теперь вы можете легко изменить расположение разрывов и этикеток. Средняя точка группы «а» - 3, группы «б» - 6,5 и т. д.

test %>% 
  ggplot(aes(position, value, color = names, group = 1)) + geom_line() +
  scale_x_continuous(breaks = c(3, 6.5, 9))

Теперь измените метки

test %>% 
  ggplot(aes(position, value, color = names, group = 1)) + geom_line() +
  scale_x_continuous(breaks = c(3, 6.5, 9), labels = c('a', 'b', 'c'))

При желании цвет можно удалить.

test %>% 
  ggplot(aes(position, value)) + geom_line() +
  scale_x_continuous(breaks = c(3, 6.5, 9), labels = c('a', 'b', 'c'))

Большое спасибо. Ваш ответ действительно полезен и четко объяснен. Это почти идеально, за исключением того факта, что я требую, чтобы метка была заключена в скобки с помощью меток оси, то есть в середине меток оси с метками оси, очерчивающими каждую группу.

person 14.09.2018 12:01

Другие вопросы по теме