Создайте сортировку графика в масштабе Лайкерта с помощью ggplot 2

У меня есть фрейм данных со структурой ниже

structure(list(Set = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("Set2", 
"Set1"), class = "factor"), Subset = c("Feminine", "Masculine", 
"Neutral", "Feminine", "Masculine", "Neutral"), Genderity = c(4.47, 
-3.65, 1.54, 4.13, -4.03, -0.61)), row.names = c(NA, -6L), class = "data.frame")

Я хочу построить график в масштабе Лайкерта, как показано ниже:  Ожидаемый вывод изображения Лайкерта

Я изо всех сил пытаюсь воспроизвести это в ggplot 2 (ниже мой код, хотя он дает аналогичный результат, как и ожидалось. Пробелы по оси y удалены, потому что я использовал гендерность в обоих аргументах x и y). Это давало мне ошибку, если я оставил аргумент y пустым

ggplot(aes(x=Genderity, y=Genderity), data=df_2, position="stack", stat="identity")+
  geom_bar(stat="identity",aes(fill=Subset),position="dodge")+
  coord_flip()+
  geom_hline(yintercept = 0, color =c("black")) +
  scale_y_continuous(breaks=seq(-5,5,1), limits=c(-5,5))+
  facet_wrap(facets = .~Set, ncol = 2, nrow=1)

Вывести ggplot из моего кода  Мои результаты

Я знаю, что мой результат действительно близок к тому, что я хочу, но это неправильный способ сделать это. Помогите, пожалуйста, как это сделать через ggplot 2


person Vaibhav Singh    schedule 08.09.2018    source источник


Ответы (2)


Мы можем попробовать обходной путь:

# add a fake column
df_2$fake <-rownames(df_2)

library(ggplot2)

# we add as x the fake
ggplot(aes(x=fake, y=Genderity), data=df_2, position="stack")+
  geom_bar(stat="identity",aes(fill=Subset),position="dodge")+
  coord_flip()+
  geom_hline(yintercept = 0, color =c("black")) +
  scale_y_continuous(breaks=seq(-5,5,1), limits=c(-5,5))+
# to avoid riffle, we use the scales="free" option
  facet_wrap(facets = .~Set, ncol = 2, nrow=1,scales="free")+
# last, we make blank the y axis
  theme(axis.title.y=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank())

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

И, если вам нужен порядок в вашем макете и если вам нужна также пустая ось x, вы можете попробовать следующее:

# the reorder option:
ggplot(aes(x=reorder(fake,Genderity), y=Genderity), data=df_2, position="stack")+
  geom_bar(stat="identity",aes(fill=Subset),position="dodge")+
  coord_flip()+
  geom_hline(yintercept = 0, color =c("black")) +
  scale_y_continuous(breaks=seq(-5,5,1), limits=c(-5,5))+
  facet_wrap(facets = .~Set, ncol = 2, nrow=1,scales="free")+
  theme(axis.title.y=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank(),
        # x-axis blank:
        axis.title.x=element_blank(),
        axis.text.x=element_blank(),
        axis.ticks.x=element_blank())

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

И:

+ ggtitle("Conveyed gender")

Дам тебе титул.

Изменить:
чтобы добавить ярлыки, вам необходимо:

    p <- ggplot(aes(x=reorder(fake,Genderity), y=Genderity), data=df_2, position="stack")+
  geom_bar(stat="identity",aes(fill=Subset),position="dodge")+
  coord_flip()+
  geom_hline(yintercept = 0, color =c("black")) +
  scale_y_continuous(breaks=seq(-5,5,1), limits=c(-5,5))+
  facet_wrap(facets = .~Set, ncol = 2, nrow=1,scales="free")+
  theme(axis.title.y=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank(),
        # x-axis blank:
        axis.title.x=element_blank(),
        axis.text.x=element_blank(),
        axis.ticks.x=element_blank())
p <- p + ggtitle("Conveyed gender") + geom_text(aes(label=Genderity), hjust=1)
p

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

Или вы также можете использовать:

+ geom_text(aes(label = Genderity), position = position_dodge(0.9))
person s__    schedule 08.09.2018
comment
Не могли бы вы показать мне, как добавлять метки рядом с полосами? - person Vaibhav Singh; 10.09.2018
comment
@Artika обновила ответ, он должен работать и с другим ответом. - person s__; 10.09.2018
comment
HI Здесь мой лейбл блокируется, так как цвет моего нейтрального цвета черный, и цвет текста тоже. Я не вижу этого, так как он падает внутри графика - person Vaibhav Singh; 10.09.2018
comment
@Artika Я обновил вывод, предоставленный моим кодом. Извините, я не понял, что вы хотите изменить, если вам нужно другое объяснение, спросите меня еще раз другими словами. - person s__; 10.09.2018
comment
Значения 1,54,4,47,4,13, которые падают внутри бара, я хочу, чтобы они были как -0,61 сразу за пределами бара. Итак, в основном я хочу, чтобы все значения были в том положении, которое зеленые полосы имеют только над полосой - person Vaibhav Singh; 10.09.2018
comment
Попробуйте увидеть последнюю строку кода + geom_text(aes(label = Genderity), position = position_dodge(0.9)) вместо + geom_text(aes(label=Genderity), hjust=1). В этом случае метки не находятся сверху, но они единообразны на столбцах. - person s__; 10.09.2018

Кажется, это хорошее место для преобразования вашей строки символов Subset в коэффициент, который позволит вам сортировать ее по своему усмотрению. Обратите внимание, что при определении сопоставления я использовал fct_rev, чтобы полоса Feminine находилась наверху, чтобы соответствовать легенде, которая показывает факторы по порядку.

df_2_mod <- df_2 %>%
  mutate(Subset = fct_relevel(Subset, "Feminine", "Neutral", "Masculine"))

ggplot(df_2_mod,
   aes(x=Subset %>% fct_rev(), y=Genderity, fill = Subset))+
geom_col()+  # geom_col uses values by default, vs. counts for geom_bar
coord_flip()+
geom_hline(yintercept = 0, color =c("black")) +
facet_wrap(facets = .~Set, nrow=1) +
labs(x="")

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

person Jon Spring    schedule 09.09.2018