Это должно помочь вам. Во-первых, позвольте мне использовать примерный набор данных и примерный блокпост:
df <- data.frame(
samplename=c(rep("A", 10), rep("B1", 10), rep("B2", 10)),
grp=c(rep("Group A", 10), rep("Group B", 20)),
y=c(rnorm(10), rnorm(10, 0.2), rnorm(10, 0.35, 0.1))
)
ggplot(df, aes(grp, y)) +
geom_boxplot(aes(fill=grp, group=samplename))
Это дает вам график, похожий на ваш пример. Поле слева расширяется, чтобы заполнить всю x эстету c, тогда как поля справа разделяются (официальный термин «уклонен»), так что сумма B1 + B2 = ширина B.
Чтобы исправить это, вы можете использовать аргумент preserve='single'
, включенный в функцию position_dodge()
, который должен применяться к аргументу position=
geom_boxpot
. Вот что я имею в виду:
ggplot(df, aes(grp, y)) +
geom_boxplot(aes(fill=grp, group=samplename),
position=position_dodge(preserve='single'))
Это устраняет проблему ширины, делая все отдельные поля (уклоненные или нет) одинаковой ширины, но это также означает, что поле, принадлежащее «Группе А», все еще уклонено слева. Это была проблема, прежде чем она была исправлена добавлением position_dodge2()
(Mov ie Subtitle: «Возвращение position_dodge!»). Простая замена на position_dodge()
устраняет эту проблему, и все поля выровнены по значениям их оси x:
ggplot(df, aes(grp, y)) +
geom_boxplot(aes(fill=grp, group=samplename),
position=position_dodge2(preserve='single'))