Controle los anchos de columna en un gráfico ggplot2 con una serie y datos inconsistentes

En los datos artificiales que he creado para el MWE a continuación, he tratado de demostrar la esencia de un script que he creado en R. Como se puede ver en el gráfico que se produce a partir de este código, en una de mis condiciones no tener un valor "No" para completar la serie.

Me han dicho que, a menos que pueda hacer esta última columna, que lamentablemente no tiene la serie adicional tan delgada como las columnas en otras partes del gráfico, no se nos permitirá, e estos gráficos. Esto es lamentablemente un problema porque el script que he escrito produce cientos de gráficos simultáneamente, completos con estadísticas, indicadores de importancia, barras de error propagadas y ajustes inteligentes del eje y (estas características, por supuesto, no están presentes en el MWE).

Pocos otros comentarios:

No se garantiza que esta columna de excepción esté al final del gráfico ... por lo que los ajustes manuales para forzar a la serie a cambiar de color e invertir el orden dejando el espacio extra en el lado derecho no es confiable.

He intentado simular los datos como un 0 constante para que la serie "esté presente" pero sea invisible, pero como era de esperar, el orden de la serie c (No, Sí) hace que omita un espacio que también es inaceptable. Así es como se respondió esta misma pregunta aquí, pero lamentablemente no funciona para mí con mis restricciones:Ancho constante para geom_bar en caso de falta de datos yIncluya espacio para el nivel de factor faltante utilizado en la estética de relleno en geom_boxplot

También intenté hacer esto con facetas, pero surgieron numerosos problemas, incluidos los saltos de línea y los errores en las anotaciones que agrego al eje 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.")

Respuestas a la pregunta(2)

Su respuesta a la pregunta