Покажите две гистограммы с точками геометрии и одной легендой, используя подграфики в r

Я хочу показать два гистограммы с точками геометрии, используя подзаголовки. мой код -

df_1 <- iris[,c("Species", "Petal.Length","Petal.Width")]
df_2 <- iris[,c("Species", "Sepal.Length","Sepal.Width")]
df_1["Condition_1"] <- "P condition"
df_1[10:20,"Condition_1"] <- "Q condition"
df_1[20:30,"Condition_1"] <- "R condition"
df_1[30:40,"Condition_1"] <- "S condition"
df_1[40:50,"Condition_1"] <- "T condition"

df_1[60:70,"Condition_1"] <- "Q condition"
df_1[70:80,"Condition_1"] <- "R condition"
df_1[80:90,"Condition_1"] <- "S condition"
df_1[90:100,"Condition_1"] <- "T condition"

df_1[110:120,"Condition_1"] <- "Q condition"
df_1[120:130,"Condition_1"] <- "R condition"
df_1[130:140,"Condition_1"] <- "S condition"
df_1[140:150,"Condition_1"] <- "T condition"


df_2["Condition_2"] <- "P condition"
df_2[10:20,"Condition_2"] <- "Q condition"
df_2[20:30,"Condition_2"] <- "R condition"
df_2[30:40,"Condition_2"] <- "S condition"
df_2[40:50,"Condition_2"] <- "T condition"

df_2[60:70,"Condition_2"] <- "Q condition"
df_2[70:80,"Condition_2"] <- "R condition"
df_2[80:90,"Condition_2"] <- "S condition"
df_2[90:100,"Condition_2"] <- "T condition"

df_2[110:120,"Condition_2"] <- "Q condition"
df_2[120:130,"Condition_2"] <- "R condition"
df_2[130:140,"Condition_2"] <- "S condition"
df_2[140:150,"Condition_2"] <- "T condition"
Condition_1 <- as.vector(unique(df_1$Condition))
Species_1 <- unique(df_1$Species)
mean_df_delta <- setNames(data.frame(matrix(ncol = 4, nrow = 0)), c("Species", "Condition", "Petal.Length", "Petal.Width"))
for(Species_name in Species_1){
  mean_df_1 <- aggregate(.~Condition_1,data=df_1,function(x) c(M = mean(x)))
  mean_df_1["Species"] <- Species_name
  num <- assign(paste("sam_df", as.character(Species_name), sep = "_"), mean_df_1)
  mean_df_delta <- rbind(mean_df_delta,num)
}
mean_df_normalized <- setNames(data.frame(matrix(ncol = 4, nrow = 0)), c("Species", "Condition", "Sepal.Length", "Sepal.Width"))
Species_2 <- unique(df_2$Species)
Condition_2 <- as.vector(unique(df_2$Condition))
for(Species_name in Species_2){
  mean_df_2 <- aggregate(.~Condition_2,data=df_2,function(x) c(M = mean(x)))
  mean_df_2["Species"] <- Species_name
  num <- assign(paste("sam_df", as.character(Species_name), sep = "_"), mean_df_2)
  mean_df_normalized <- rbind(mean_df_normalized,num)
}

delta_ct_plot <- ggplotly(ggplot(mean_df_delta, aes(fill=Condition_1, y=Petal.Length, x=Species)) + geom_bar(position=position_dodge(width=0.9), stat="identity") +
                    geom_errorbar(aes(ymax=Petal.Length+Petal.Width, ymin=Petal.Length-Petal.Width) , position=position_dodge(width=0.9), width=0.25) +
                    geom_point(data=df_1,
                               aes(Species,Petal.Length,color=Condition_1),position=position_dodge(width=0.9),
                               colour = "black")+theme(legend.title=element_blank()))
normalized_bar_plot <- ggplotly(ggplot(mean_df_normalized, aes(fill=Condition_2, y=Sepal.Length, x=Species)) + geom_bar(position=position_dodge(width=0.9), stat="identity") +
                            geom_errorbar(aes(ymax=Sepal.Length+Sepal.Width, ymin=Sepal.Length-Sepal.Width) , position=position_dodge(width=0.9), width=0.25) +
                            geom_point(data=df_2,
                                       aes(Species,Sepal.Length,color=Condition_2),position=position_dodge(width=0.9),
                                       colour = "black")+theme(legend.title=element_blank()))
subplot(delta_ct_plot, normalized_bar_plot)

Теперь mean_df_delta и mean_df_normalized - это мой фрейм данных для гистограмм и полосы ошибок. df_1 и df_2 - это кадр данных для точек геометрии.

результат, который я получаю

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

Теперь легенды на изображении выше повторяются. Я хочу легенду только 1 раз. И я хочу, чтобы все точки геометрии были черного цвета. Цвет полосы не должен заполнять точку геометрии.

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


person prateekeshwar singh    schedule 07.05.2018    source источник
comment
Можете ли вы вставить вывод dput(exp_files_con) в свой вопрос? Пожалуйста, прочитайте stackoverflow .com/questions/5963269/, чтобы узнать, как создавать воспроизводимые примеры в R.   -  person hpesoj626    schedule 07.05.2018
comment
В aes() используйте aes(show.legend = FALSE)   -  person anup    schedule 07.05.2018
comment
@anup уже пробовал это. Также пробовал другие, такие как hidelegend(), guides(fill=FALSE), scale_fill_discrete(guide=FALSE), theme(legend.position=none). Только hidelegend() и theme(legend.position=none) работа, и она удаляет всю легенду, если я помещаю их во второй сюжет. то есть во втором аргументе подзаговора   -  person prateekeshwar singh    schedule 07.05.2018
comment
@hpesoj626 это фрейм данных с 4 столбцами Condition, Value, Gene, Sd_Error и соответствующим значением   -  person prateekeshwar singh    schedule 07.05.2018
comment
@prateekeshwarsingh, еще раз, пожалуйста, прочитайте эту ссылку: stackoverflow.com/questions/5963269/. Мы не сможем вам помочь, если не сможем воспроизвести вашу проблему. Мы можем воспроизвести вашу проблему, только если вы предоставите нам свой набор данных. Самый простой способ сделать это — вставить вывод dput(exp_files_con) в свой вопрос.   -  person hpesoj626    schedule 07.05.2018
comment
@hpesoj626 теперь написал весь код с обобщенным фреймом данных iris. Вы можете просто скопировать и запустить этот код. Заранее спасибо за любую помощь.   -  person prateekeshwar singh    schedule 08.05.2018


Ответы (1)


Кажется, что ggplotly отображает каждую из групповых меток из каждого из подзаговоров. Вместо этого используйте facet_wrap(), чтобы сгенерировать только 1 набор меток. Для этого я изменил циклы, которые вы сделали, на совершенно «аккуратный» подход.

library(tidyverse)
library(plotly)
df <- iris

df["Condition"] <- "P condition"
df[10:20,"Condition"] <- "Q condition"
df[20:30,"Condition"] <- "R condition"
df[30:40,"Condition"] <- "S condition"
df[40:50,"Condition"] <- "T condition"

df[60:70,"Condition"] <- "Q condition"
df[70:80,"Condition"] <- "R condition"
df[80:90,"Condition"] <- "S condition"
df[90:100,"Condition"] <- "T condition"

df[110:120,"Condition"] <- "Q condition"
df[120:130,"Condition"] <- "R condition"
df[130:140,"Condition"] <- "S condition"
df[140:150,"Condition"] <- "T condition"

df1 <- df %>%
  gather(var, value, -Condition, -Species) %>%
  ungroup() %>%
  separate(var, into = c("var", "measure")) %>%
  group_by(measure) %>%
  mutate(id = row_number()) %>%
  spread(measure, value) %>%
  select(-id)


df2 <- df1 %>%
  group_by(Condition) %>%
  mutate_at(vars(Length:Width), mean) %>%
  ungroup() %>%
  mutate(ymax = Length + Width,
         ymin = Length - Width) %>%
  unique()



p <- df2 %>% ggplot(aes(fill=Condition, y=Length, x=Species)) + geom_bar(position=position_dodge(width=0.9), stat="identity") +
  geom_errorbar(aes(ymax=ymax, ymin=ymin) , position=position_dodge(width=0.9), width=0.25) +
  geom_point(data=df1,
             aes(Species,Length,color=Condition),position=position_dodge(width=0.9),
             colour = "black")+theme(legend.title=element_blank()) + 
  facet_wrap(~var, scales = "free_y") + xlab(NULL) + ylab(NULL)

ggplotly(p)  

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

Я также должен отметить, что усреднение только по условию не имеет для меня смысла. Но я думаю, что вам просто нужно приспособиться к вашему варианту использования.

person hpesoj626    schedule 08.05.2018
comment
можно ли заполнить все точки геометрии черным цветом. Цвет полосы не должен заполнять точку геометрии. - person prateekeshwar singh; 09.05.2018
comment
Боюсь, я плохо знаком с ggplotly. Попробуйте опубликовать это как вопрос, и вы можете получить ответ. - person hpesoj626; 09.05.2018
comment
используется вышеприведенный код напрямую. Но он показывает график только для чашелистика. График лепестков не отображается, он становится пустым. - person prateekeshwar singh; 09.05.2018