Изменить ось y ggplot2 на целые, не ограничивая ось y для нескольких графиков - PullRequest
0 голосов
/ 01 апреля 2019

Так же, как этот вопрос опубликовано здесь Я хочу создать серию гистограмм без необходимости устанавливать верхнее предельное значение y, но чтобы шкала была только целочисленной и увеличивалась по мере необходимости на оси , у некоторых графов будет 2, у некоторых 45. Таким образом, на графиках, которые будут иметь максимум 2, я не хочу видеть масштаб 0,2, 0,4., 0,6, 0,8, 1, 1,2, 1,4 ,. ... Я хотел бы видеть 1, 2. Те, которые идут к 45, могут увеличиваться по мере необходимости, но не сжимать числа в ось или сбрасывать значения. Я не знаю, как привести сокращенные примеры данных, но я показал некоторые графические результаты, которые, я надеюсь, помогут. В основном код пытается сгенерировать гистограмму для каждого года, в каждом GMU (это местоположение), подсчет по полу Cementum (это возраст). Итак, в 2015 году в местоположении 12 было 10 женщин и 7 мужчин в возрасте 1 года и т. Д. Все началось с того, что я не хотел разрыва между гистограммой и осевыми линиями. Когда вы расширяете ось x или ось y, чтобы она была заподлицо, она портит все значения осей. Я мог бы установить пределы оси X, поскольку я знаю, что для любого года 15 - самый старый возможный возраст. ось Y отсчета будет изменяться. У меня 10 лет данных, 14 локаций, 2 пола, максимальный возраст 15 лет.

for (i in 1:length(unique(adultmar$Year))) { 
year = subset(adultmar, adultmar$Year == unique(adultmar$Year)[i])

  for (j in 1:length(unique(year$GMU))) {
    yearGMU = subset(year, year$GMU == unique(year$GMU)[j])

AgeSex <- ggplot(yearGMU, aes(x=Cementum, fill = Sex, colour = Sex))+
  geom_histogram(binwidth = 1, alpha = 1)+
  labs(title = paste0(unique(year$GMU)[j],"_",unique(adultmar$Year)[i]))+
  labs(x = "Age", y = "Count")+
  facet_grid(Sex~.)+
  expand_limits(x=15)+
  scale_x_continuous(breaks=seq(1,15,2),expand = c(0,0))+
  scale_fill_manual(name = "Sex",values = myColors, 1)+
  scale_color_manual(values = c("black", "black"))+
  theme_minimal()+
  theme(legend.position="none",
        panel.border = element_blank(),
        axis.line.y = element_line(colour = "black"),
        panel.background = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.spacing = unit(1, "lines"),
        axis.text = element_text(size = 12),
        legend.text = element_text(size = 12),
        axis.title.y = element_text(size = 12),
        axis.title.x = element_text(size = 12),
        strip.text.x = element_text(size = 12))

Я попытался добавить следующие решения в виде строк. Ни один не дает последовательного результата

ylim(digits=1)+

scale_y_continuous(breaks=seq(0,45),expand = expand_scale(mult = c(0, .1)))+

scale_y_continuous(breaks=seq(from=0,to=round(max(yearGMU$Cementum)),1))+

scale_y_continuous(breaks=pretty_breaks())+

scale_y_continuous(breaks = function(x) seq(ceiling(x[1]), floor(x[2])))+

Поскольку серии графиков создаются без каких-либо команд по оси Y, некоторые графики, кажется, работают нормально: enter image description here Но затем в этом же продукте появляются графики, на которых отображается десятичное место, или оно даже не указывает верхнее предельное значение y, как в этих двух: decimal placesunnecessary decimals[![works, but why drop the upper y limit?

Попробовав множество вариантов команд примера для изменения шкалы y, я получаю графики с информацией о нулевой оси, графики с перекрывающимися числами, графики с числами, которые идут до 10, и затем ничего над ними, хотя гистограмма явно продолжается намного выше 30. как эти: overlapping values

1 Ответ

1 голос
/ 01 апреля 2019

Вы должны написать собственную функцию перерывов.Я думаю, что-то вроде этого должно работать:

integer_breaks = function(range) {
  bmax = ceiling(range[2])
  bmin = floor(range[1])
  if (bmax - bmin < 7) return(bmin:bmax)
  pretty(range)
}

Если вы предоставите воспроизводимый пример, мы можем проверить.

... + scale_y_continuous(breaks = integer_breaks)

Обратите внимание, что это довольно хрупкая функция --- выиграно 'хорошо работает с отрицательными входами.Но должно работать нормально для гистограмм.

...