Полосы в geom_bar имеют нежелательную различную ширину при использовании facet_wrap

Я не могу найти решение для следующих проблем. Буду очень признателен за помощь!

Следующий код создает гистограммы с использованием фасета. Однако из-за «дополнительного пространства» ggplot2 в некоторых группах делает полосы намного шире, даже если я укажу ширину 0,1 или подобную. Меня это очень раздражает, потому что это выглядит очень непрофессионально. Я хочу, чтобы все столбцы выглядели одинаково (кроме заливки). Я надеюсь, что кто-нибудь может сказать мне, как это исправить.

Во-вторых, как я могу изменить порядок различных классов в фасетных окнах, чтобы порядок всегда был C1, C2... C5, M, F, All, где это применимо. Пробовал с упорядочиванием уровней фактора, но поскольку не все классы присутствуют в каждой части графа, не получилось, по крайней мере, я предполагаю, что причина в этом.

В-третьих, как уменьшить расстояние между стержнями? Так что весь график более сжат. Даже если я уменьшу изображение для экспорта, R уменьшит масштаб полос, но промежутки между полосами все равно огромны.

Я был бы признателен за отзыв для любого из этих ответов!

Мои данные: http://pastebin.com/embed_iframe.php?i=kNVnmcR1

Мой код:

library(dplyr)
library(gdata)
library(ggplot2)
library(directlabels)
library(scales) 

all<-read.xls('all_auto_visual_c.xls')

all$station<-as.factor(all$station)
#all$group.new<-factor(all$group, levels=c('C. hyperboreus','C. glacialis','Special Calanus','M. longa','Pseudocalanus sp.','Copepoda'))

allp <- ggplot(data = all, aes(x=shortname2, y=perc_correct, group=group,fill=sample_size)) + 

  geom_bar(aes(fill=sample_size),stat="identity", position="dodge", width=0.1, colour="NA") + scale_fill_gradient("Sample size (n)",low="lightblue",high="navyblue")+
  facet_wrap(group~station,ncol=2,scales="free_x")+

  xlab("Species and stages") + ylab("Automatic identification and visual validation concur (%)") +
  ggtitle("Visual validation of predictions") + 
  theme_bw() + 

  theme(plot.title = element_text(lineheight=.8, face="bold", size=20,vjust=1), axis.text.x = element_text(colour="grey20",size=12,angle=0,hjust=.5,vjust=.5,face="bold"), axis.text.y = element_text(colour="grey20",size=12,angle=0,hjust=1,vjust=0,face="bold"),  axis.title.x = element_text(colour="grey20",size=15,angle=0,hjust=.5,vjust=0,face="bold"), axis.title.y = element_text(colour="grey20",size=15,angle=90,hjust=.5,vjust=1,face="bold"),legend.position="none", strip.text.x = element_text(size = 12, face="bold", colour = "black", angle = 0), strip.text.y = element_text(size = 12, face="bold", colour = "black"))
allp

#ggsave(allp, file="auto_visual_stackover.jpeg", height= 11, width= 8.5, dpi= 400,)

Текущий график, который нуждается в исправлении:

введите здесь описание изображения

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


person Moritz Schmid    schedule 12.05.2015    source источник
comment
1. будет грубым с geom_bar, width интерпретируется как доля расстояния между соседними стержнями. Возможно, вместо этого используйте geom_segment, тогда size будет интерпретироваться как абсолютное значение. Для 2 переупорядочивание уровней факторов — это способ сделать это. Для 3 увеличьте width, вы установили его на 0,1, поэтому вы указываете ggplot использовать только 10% пространства (или использовать geom_segment).   -  person Gregor Thomas    schedule 12.05.2015
comment
Спасибо! Я посмотрю на это. Вопрос по уровням факторов. Я могу поместить все классы (C1....C2&1 и т.д.) в один уровневый фактор, даже если не все из них присутствуют в одних и тех же аспектах?   -  person Moritz Schmid    schedule 12.05.2015


Ответы (2)


Предполагая, что ширина полос обратно пропорциональна количеству x-разрывов, можно ввести соответствующий коэффициент масштабирования в качестве эстетики width для управления шириной полос. Но сначала подсчитайте количество x-разрывов в каждой панели, вычислите коэффициент масштабирования и поместите их обратно во фрейм данных «все».

Обновление до ggplot2 2.0.0 Каждый столбец, упомянутый в facet_wrap, получает собственную строку в полосе. При редактировании в фрейме данных устанавливается новая переменная метки, чтобы метка полосы оставалась на одной строке.

library(ggplot2)
library(plyr)

all = structure(list(station = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("Station 101", 
"Station 126"), class = "factor"), shortname2 = structure(c(2L, 
7L, 8L, 11L, 1L, 5L, 7L, 8L, 11L, 1L, 2L, 3L, 5L, 7L, 8L, 12L, 
11L, 1L, 6L, 8L, 15L, 14L, 9L, 10L, 4L, 6L, 2L, 7L, 8L, 11L, 
1L, 5L, 7L, 8L, 11L, 1L, 2L, 3L, 5L, 7L, 8L, 12L, 11L, 1L, 8L, 
11L, 1L, 15L, 14L, 13L, 9L, 10L), .Label = c("All", "C1", "C2", 
"C2&1", "C3", "C3&2", "C4", "C5", "Cegg", "Cnaup", "F", "M", 
"Micro", "Oith", "Tric"), class = "factor"), color = c(1L, 2L, 
3L, 4L, 5L, 6L, 7L, 8L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 
18L, 19L, 21L, 26L, 30L, 31L, 33L, 34L, 20L, 21L, 1L, 2L, 3L, 
4L, 5L, 6L, 7L, 8L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 
19L, 26L, 28L, 29L, 30L, 31L, 32L, 33L, 34L), group = structure(c(1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 6L, 5L, 3L, 3L, 3L, 3L, 6L, 6L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 3L, 3L, 
3L, 3L, 3L), .Label = c("cgla", "Chyp", "Cope", "mlong", "pseudo", 
"specC"), class = "factor"), sample_size = c(11L, 37L, 55L, 16L, 
119L, 21L, 55L, 42L, 40L, 158L, 24L, 16L, 17L, 27L, 14L, 45L, 
98L, 241L, 30L, 34L, 51L, 22L, 14L, 47L, 13L, 41L, 24L, 41L, 
74L, 20L, 159L, 18L, 100L, 32L, 29L, 184L, 31L, 17L, 27L, 23L, 
21L, 17L, 49L, 185L, 30L, 16L, 46L, 57L, 16L, 12L, 30L, 42L), 
    perc_correct = c(91L, 78L, 89L, 81L, 85L, 90L, 91L, 93L, 
    80L, 89L, 75L, 75L, 76L, 81L, 86L, 76L, 79L, 78L, 90L, 97L, 
    75L, 86L, 93L, 74L, 85L, 88L, 88L, 90L, 92L, 90L, 91L, 89L, 
    89L, 91L, 90L, 89L, 81L, 88L, 74L, 78L, 90L, 82L, 84L, 82L, 
    90L, 94L, 91L, 81L, 69L, 83L, 90L, 81L)), class = "data.frame", row.names = c(NA, 
-52L))

all$station <- as.factor(all$station)

# Calculate scaling factor and insert into data frame
library(plyr)
N = ddply(all, .(station, group), function(x) length(row.names(x)))
N$Fac = N$V1 / max(N$V1)
all = merge(all, N[,-3], by = c("station", "group"))
all$label = paste(all$group, all$station, sep = ", ")


allp <- ggplot(data = all, aes(x=shortname2, y=perc_correct, group=group, fill=sample_size, width = .5*Fac)) + 
  geom_bar(stat="identity", position="dodge",  colour="NA") +
  scale_fill_gradient("Sample size (n)",low="lightblue",high="navyblue")+
  facet_wrap(~label,ncol=2,scales="free_x")   +
  xlab("Species and stages") + ylab("Automatic identification and visual validation concur (%)") +
  ggtitle("Visual validation of predictions") + 
  theme_bw() + 
  theme(plot.title = element_text(lineheight=.8, face="bold", size=20,vjust=1),
    axis.text.x = element_text(colour="grey20",size=12,angle=0,hjust=.5,vjust=.5,face="bold"), 
    axis.text.y = element_text(colour="grey20",size=12,angle=0,hjust=1,vjust=0,face="bold"), 
    axis.title.x = element_text(colour="grey20",size=15,angle=0,hjust=.5,vjust=0,face="bold"), 
    axis.title.y = element_text(colour="grey20",size=15,angle=90,hjust=.5,vjust=1,face="bold"),
    legend.position="none", 
    strip.text.x = element_text(size = 12, face="bold", colour = "black", angle = 0), 
    strip.text.y = element_text(size = 12, face="bold", colour = "black"))

allp

введите здесь описание изображения

person Sandy Muspratt    schedule 12.05.2015
comment
Итак, я попробовал то же самое, но получил предупреждение (с выводом по-прежнему разной ширины): Warning: Ignoring unknown aesthetics: width. КОД: pastebin.com/10U5ydai Вы можете помочь? - person Urvah Shabbir; 31.05.2018
comment
@urwaCFC Когда я запускаю приведенный выше код, используя текущую версию CRAN ggplot2 (версия 2.2.1), я получаю диаграмму, как показано выше (т. Е. Все ширины столбцов одинаковы). Я также получаю предупреждающее сообщение. Если вас беспокоит предупреждение, возможно, вам придется задать новый вопрос. - person Sandy Muspratt; 04.06.2018
comment
@urwaCFC Однако, если я перенесу эстетику width из geom_bar обратно в глобальную эстетику, предупреждающее сообщение не будет создано. См. отредактированный код выше. - person Sandy Muspratt; 04.06.2018

Вот что я сделал по предложению Грегора. Я думаю, что использование geom_segment и geom_point делает хороший график.

library(ggplot2)

all<-read.xls('all_auto_visual_c.xls')

all$station<-as.factor(all$station)
all$group.new<-factor(all$group, levels=c('C. hyperboreus','C. glacialis','Combined','M. longa','Pseudocalanus sp.','Copepoda'))
all$shortname2.new<-factor(all$shortname2, levels=c('All','F','M','C5','C4','C3','C2','C1','Micro',     'Oith','Tric','Cegg','Cnaup','C3&2','C2&1'))

allp<-ggplot(all, aes(x=perc_correct, y=shortname2.new)) +
  geom_segment(aes(yend=shortname2.new), xend=0, colour="grey50") +
  geom_point(size=4, aes(colour=sample_size)) +
  scale_colour_gradient("Sample size (n)",low="lightblue",high="navyblue") +
  geom_text(aes(label = perc_correct, hjust = -0.5)) +
  theme_bw() +
  theme(panel.grid.major.y = element_blank()) +
  facet_grid(group.new~station,scales="free_y",space="free") +
  xlab("Automatic identification and visual validation concur (%)") + ylab("Species and stages")+
  ggtitle("Visual validation of predictions")+
  theme_bw() + 
  theme(plot.title = element_text(lineheight=.8, face="bold", size=20,vjust=1), axis.text.x = element_text(colour="grey20",size=12,angle=0,hjust=.5,vjust=.5,face="bold"), axis.text.y = element_text(colour="grey20",size=12,angle=0,hjust=1,vjust=0,face="bold"), axis.title.x = element_text(colour="grey20",size=15,angle=0,hjust=.5,vjust=0,face="bold"), axis.title.y = element_text(colour="grey20",size=15,angle=90,hjust=.5,vjust=1,face="bold"),legend.position="none", strip.text.x = element_text(size = 12, face="bold", colour = "black", angle = 0), strip.text.y = element_text(size = 8, face="bold", colour = "black"))

allp

ggsave(allp, file="auto_visual_no_label.jpeg", height= 11, width= 8.5, dpi= 400,)

Вот что он производит!

введите здесь описание изображения

person Moritz Schmid    schedule 12.05.2015
comment
Хорошая работа! Спасибо за публикацию собственного ответа! Мне нравится стиль точечной диаграммы, как и здесь, но если вы предпочитаете столбцы, вы должны иметь возможность увеличивать geom_segments, установив size очень большим. - person Gregor Thomas; 13.05.2015
comment
Спасибо! Да, можно, но в данном случае мне нравится, что он тонкий и не отвлекает. Цветовая заливка точки думаю достаточная, хотя цветовая гамма не супер для черчения.... - person Moritz Schmid; 13.05.2015