ggplot2 geom_bar: центрирующие полосы

Я был бы очень признателен за помощь с проблемой ggplot2. Я долго присматривался к нему, так что мой лучший шанс сейчас здесь. Предоставляю воспроизводимый сценарий.

Пожалуйста, посмотрите мой текущий график по этой ссылке

Что мне нужно сделать, так это центрировать полосы по горизонтали. На данный момент они поляризуются в разные стороны, особенно на барах 2009 и 2012 годов.

Центрирование их позволило бы мне свободно регулировать их ширину, тогда как сейчас я не могу.

Это текущий автономный код:

install.packages('ggplot2')
library(ggplot2)

# Data    

Year = c('2009','2009','2009','2009','2010','2010','2010','2010','2011','2011','2011','2011','2012','2012','2012','2012')

City = c('Kaunas','Vilnius','Kaunas','Vilnius','Kaunas','Vilnius','Kaunas','Vilnius',
         'Kaunas','Vilnius','Kaunas','Vilnius','Kaunas','Vilnius','Kaunas','Vilnius')

Busy = c('Peak', 'Peak', 'Off-peak', 'Off-peak', 'Peak', 'Peak', 'Off-peak', 'Off-peak', 'Peak', 'Peak', 'Off-peak', 
         'Off-peak', 'Peak', 'Peak', 'Off-peak', 'Off-peak')

Result = c(-0.417277550641143, 0.540415934506096, -0.887323992801467, -1.0016151369497, -1.69512596882652, 
           -0.474180286913426, -1.87972395432173, -1.55647964460481, -1.10385766877877, -3.19261229467907, 
           -2.11137007243349, -3.24910554029829, -0.949278709972917, -2.22558030912235, -1.3496651478542, -2.59961942855099)

pvalue.asterisks = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, '*', NA, '*', NA, NA, NA, NA)

Results = data.frame(Year, City, Busy, Result, pvalue.asterisks)

str(Results)
Results

# Plot

ggplot(Results, aes(Year, Result, fill=City)) +
  ylab(expression(paste(italic('t'), '-value'))) +
  facet_grid(list('Busy', 'Year')) + scale_fill_grey(start = 0, end = .6) +
  geom_bar(width=2.9, stat = "identity", position = position_dodge(width = 3)) +
  scale_y_continuous(expand = c(.035,0)) + scale_x_discrete(expand = c(.7,.4)) +
  theme( axis.title.x=element_blank(), axis.text.x = element_blank(),
         axis.title.y = element_text(size=19, face="bold", margin = margin(0, 3, 0, 0)),
         axis.text.y = element_text(size = 13),
         legend.title = element_blank(), legend.text = element_text(size=17),
         legend.background = element_rect(fill="white", size=0.1, linetype="solid"),
         legend.key.size = unit(1.7,"line"), axis.ticks.x=element_blank(), legend.position = c(.167, .6),
         panel.background = element_blank(),    plot.title = element_blank(),
         legend.margin=margin(c(-.05,.14,.11,.1), unit='cm'), 
         panel.grid.major.y = element_line(colour = "grey90"),
         panel.grid.major.x = element_blank(), plot.margin = unit(c(.05, .1, 0, .1), 'cm'),
         strip.text.x = element_text(face='bold', size=15, margin = margin(.2, 0, .2, 0, "cm")),
         strip.text.y = element_text(face='bold', size=15, margin = margin(0, .2, 0, .2, "cm")),
         strip.background = element_rect(colour="grey48", fill='grey95'), panel.spacing = unit(.08, "lines")) +
  geom_text(aes(x=Year, y=Result, label=pvalue.asterisks), vjust=-.01, colour= 'white', size=15, hjust=-.168 )

-- Большое спасибо


person Pablo Bernabeu    schedule 20.09.2018    source источник


Ответы (2)


Если вы удалите материал theme, вы увидите проблему, ось X - это годы, и он пытается отобразить каждый из них по значению x для этого года. Один из способов исправить это — установить для параметра scales значение facet_grid, чтобы оно было "free_x".

facet_grid(list('Busy', 'Year'), scales="free_x")

а затем вам нужно только настроить размер баров.

geom_bar(width=0.5, stat = "identity", position = "dodge")
person Nick Larsen    schedule 20.09.2018

Вам просто нужно добавить scales = 'free_x' в свой скрипт. Вы также можете заменить geom_bar(stat = 'identity') на geom_col()

Соответствующая информация взята с ?facet_grid

scales: Используются ли шкалы для всех фасетов (по умолчанию "фиксированные") или они различаются для строк ("free_x"), столбцов ("free_y") или для строк и столбцов ("free")?

p1 <- ggplot(Results, aes(Year, Result, fill=City)) +
  ylab(expression(paste(italic('t'), '-value'))) +
  facet_grid(rows = vars(Busy), cols = vars(Year), scales = 'free_x') +  
  scale_fill_grey(start = 0, end = .6) +
  geom_col(position = position_dodge(width = 0.9)) +
  scale_y_continuous(expand = c(.035,0)) + 
  scale_x_discrete(expand = c(.7,.4))

p1 +
  theme( axis.title.x=element_blank(), axis.text.x = element_blank(),
         axis.title.y = element_text(size=19, face="bold", margin = margin(0, 3, 0, 0)),
         axis.text.y = element_text(size = 13),
         legend.title = element_blank(), legend.text = element_text(size=17),
         legend.background = element_rect(fill="white", size=0.1, linetype="solid"),
         legend.key.size = unit(1.7,"line"), axis.ticks.x=element_blank(), legend.position = c(.167, .6),
         panel.background = element_blank(),    plot.title = element_blank(),
         legend.margin=margin(c(-.05,.14,.11,.1), unit='cm'), 
         panel.grid.major.y = element_line(colour = "grey90"),
         panel.grid.major.x = element_blank(), plot.margin = unit(c(.05, .1, 0, .1), 'cm'),
         strip.text.x = element_text(face='bold', size=15, margin = margin(.2, 0, .2, 0, "cm")),
         strip.text.y = element_text(face='bold', size=15, margin = margin(0, .2, 0, .2, "cm")),
         strip.background = element_rect(colour="grey48", fill='grey95'), panel.spacing = unit(.08, "lines")) +
  geom_text(aes(x=Year, y=Result, label=pvalue.asterisks), vjust=-.01, colour= 'white', size=15, hjust=-.168 )
#> Warning: Removed 14 rows containing missing values (geom_text).

Создано 20 сентября 2018 г. с помощью пакета reprex (v0.2.1.9000)

person Tung    schedule 20.09.2018
comment
Большое спасибо. Ваш ответ работает отлично. Я просто отметил Ника, потому что он был опубликован чуть раньше. - person Pablo Bernabeu; 20.09.2018