Ширина столбцов управления в графе ggplot2 с рядом и непоследовательными данными
В искусственных данных, которые я создал для MWE ниже, я попытался продемонстрировать суть script, который я создал в R. Как видно из графика, который получается из этого кода, на одном из моих условия У меня нет значения "Нет" для завершения серии.
Мне сказали, что если я не смогу сделать этот последний столбец, у которого, к сожалению, нет лишней серии, такой же тонкой, как в столбцах, где на графике мне не разрешат использовать эти графики. Это печально проблема, потому что написанный мной script производит сотни графиков одновременно, в комплекте со статистикой, индикаторами значимости, предустановленными барами ошибок и интеллектуальными настройками оси Y (эти функции, конечно же, отсутствуют в MWE).
Несколько других комментариев:
-
Этот столбец исключений не гарантируется в конце графика... поэтому ручная настройка, чтобы заставить серию изменить цвет и инвертировать порядок, оставляя лишнее пространство с правой стороны, не является надежным.
-
Я попытался имитировать данные как константу 0, так что серия "присутствует", но невидима, но, как и следовало ожидать, порядок серий c (No, Yes) делает этот пробел пробелом что также неприемлемо. Вот как на этот же вопрос был дан ответ, но, к сожалению, это не работает для меня с моими ограничениями: Согласованная ширина для geom_bar в случае отсутствия данных и Включить пробел для недостающего уровня фактора, используемого при заполнении эстетики в geom_boxplot
-
Я также попытался сделать это с помощью граней, но возникли многочисленные проблемы, включая разрывы строк и ошибки в аннотации, которые я добавляю к оси X.
MWE:
library(ggplot2)
print("Program started")
x <- c("1","2","3","1","2","3","4")
s <- c("No","No","No","Yes","Yes","Yes","Yes")
y <- c(1,2,3,2,3,4,5)
df <- as.data.frame(cbind(x,s,y))
print(df)
gg <- ggplot(data = df, aes_string(x="x", y="y", weight="y", ymin=paste0("y"), ymax=paste0("y"), fill="s"));
dodge_str <- position_dodge(width = NULL, height = NULL);
gg <- gg + geom_bar(position=dodge_str, stat="identity", size=.3, colour = "black")
print(gg)
print("Program complete - a graph should be visible.")
Ответы
Ответ 1
За счет собственных вычислений для x-координат баров, как показано ниже, вы можете получить диаграмму, которая может быть близка к тому, что вы ищете.
x <- c("1","2","3","1","2","3","4")
s <- c("No","No","No","Yes","Yes","Yes","Yes")
y <- c(1,2,3,2,3,4,5)
df <- data.frame(cbind(x,s,y) )
df$x_pos[order(df$x, df$s)] <- 1:nrow(df)
x_stats <- as.data.frame.table(table(df$x), responseName="x_counts")
x_stats$center <- tapply(df$x_pos, df$x, mean)
df <- merge(df, x_stats, by.x="x", by.y="Var1", all=TRUE)
bar_width <- .7
df$pos <- apply(df, 1, function(x) {xpos=as.numeric(x[4])
if(x[5] == 1) xpos
else ifelse(x[2]=="No", xpos + .5 - bar_width/2, xpos - .5 + bar_width/2) } )
print(df)
gg <- ggplot(data=df, aes(x=pos, y=y, fill=s ) )
gg <- gg + geom_bar(position="identity", stat="identity", size=.3, colour="black", width=bar_width)
gg <- gg + scale_x_continuous(breaks=df$center,labels=df$x )
plot(gg)
----- edit ----------------------------------------- ---------
Модифицировано для размещения меток в центре баров.
Дает следующую таблицу
![enter image description here]()
Ответ 2
Да, я понял, что произошло: вам нужно быть более осторожным в отношении факторов, которые являются факторами и числами, являющимися числами. В моем случае с stringsAsFactors = FALSE
у меня есть
str(df)
'data.frame': 7 obs. of 3 variables:
$ x: chr "1" "2" "3" "1" ...
$ s: chr "No" "No" "No" "Yes" ...
$ y: chr "1" "2" "3" "2" ...
dput(df)
structure(list(x = c("1", "2", "3", "1", "2", "3", "4"), s = c("No",
"No", "No", "Yes", "Yes", "Yes", "Yes"), y = c("1", "2", "3",
"2", "3", "4", "5")), .Names = c("x", "s", "y"), row.names = c(NA,
-7L), class = "data.frame")
без каких-либо факторов и числовых символов, превращенных в символ из-за cbind
-ing (sic!). Возьмем еще один фрейм данных:
dff <- data.frame(x = factor(df$x), s = factor(df$s), y = as.numeric(df$y))
Добавление строки "dummy" (вручную для вашего примера, проверьте версию expand.grid
в связанном вопросе о том, как это сделать автоматически):
dff <- rbind(dff, c(4, "No", NA))
Построение (я удалил лишний айс):
ggplot(data = df3, aes(x, y, fill=s)) +
geom_bar(position=dodge_str, stat="identity", size=.3, colour="black")
![enter image description here]()