首页 > 解决方案 > geom_line() 仅使用默认的红色和蓝色,而不是 R ggplot 函数中指定的颜色

问题描述

我正在使用ggplot()构建两个散点图,分别绘制 (1) 男性和 (2) 女性患者的健康评估评分与治疗 # 周的情况,此外,我还geom_line()用于绘制男性和女性的回归线叠加图图形。

我的问题:如何将线叠加的颜色与散点图点的颜色(“steelblue2”和“pink3”)相匹配,同时仍保留图例?

我发现如果我移出incolor中的aes()参数geom_line(),线条和散点图点的颜色匹配,但随后图例消失了。

我的代码和来自我的数据的示例:

mean_behav_by_numweeks = data.frame(
  numweeks_round = c(1:10), 
  Mean_Behavior_Score_Male = c(3.32,4.18,3.82,4.06,3.33, 3.80,3.64,3.66,3.37,3.82), 
  nrow_male = c(396,323,293,259,226,217,202,190,170,167), 
  lm_results_predict_male = c(3.82,3.80,3.78,3.76,3.74, 3.72,3.70,3.68,3.66,3.64), 
  Mean_Behavior_Score_Female = c(2.91,3.79,3.65,3.41, 2.88,2.88,3.78,2.98,3.67,3.93), 
  nrow_female = c(109,82,72,74,66,60,58,56,52,50),
  lm_results_predict_female=c(3.44,3.44,3.45,3.45, 3.46,3.47,3.47,3.48,3.48,3.49))

gg_plot1 <- ggplot(mean_behav_by_numweeks, 
                   aes(numweeks_round, 
                       Mean_Behavior_Score_Male, 
                       size = mean_behav_by_numweeks$nrow_male)) + 
  geom_point(colour='steelblue2') +
  ggtitle(paste("Scatter plot of mean behavior assessment score by member by # weeks \n since 1st assessment for", 
                as.character(var), 
                "among Male Medi-Cal plan members")) + 
  theme(plot.title = element_text(size=10.9, hjust = 0.5)) + 
  theme(axis.text = element_text(size=8)) + 
  scale_size_continuous(range = c(1, 7)) +
  xlab("Number of weeks since 1st assessment") + 
  ylab("Mean behavior assessment score") + 
  theme(legend.position="bottom") + 
  labs(size="# members") +
  geom_line(data=mean_behav_by_numweeks, 
            aes(numweeks_round, lm_results_predict_male, color='steelblue2'), 
            size=1) +
  geom_line(data=mean_behav_by_numweeks, 
            aes(numweeks_round, lm_results_predict_female, color='pink3'), 
            size=1) +
  scale_color_discrete(name = "GenderCode", labels = c("Female", "Male")) + 
  theme(legend.position="bottom") + 
  guides(color = guide_legend(order=1, direction="vertical"))

gg_plot1


gg_plot2 <- ggplot(mean_behav_by_numweeks, 
                   aes(numweeks_round, 
                       Mean_Behavior_Score_Female, 
                       size = mean_behav_by_numweeks$nrow_female)) + 
  geom_point(colour='pink3') +
  ggtitle(paste("Scatter plot of mean behavior assessment score by member by # weeks \n since 1st assessment for", 
                as.character(var), 
                "among Female Medi-Cal plan members")) + 
  theme(plot.title = element_text(size=10.9, hjust = 0.5)) + 
  theme(axis.text = element_text(size=8)) + 
  scale_size_continuous(range = c(1, 7)) +
  xlab("Number of weeks since 1st assessment") + 
  ylab("Mean behavior assessment score") + 
  theme(legend.position="bottom") + 
  labs(size="# members") +
  geom_line(data=mean_behav_by_numweeks, 
            aes(numweeks_round, lm_results_predict_male, color='steelblue2'), 
            size=1) +
  geom_line(data=mean_behav_by_numweeks, 
            aes(numweeks_round, lm_results_predict_female, color='pink3'), size=1) +
  scale_color_discrete(name = "GenderCode", labels = c("Female", "Male")) + 
  theme(legend.position="bottom") + 
  guides(color = guide_legend(order=1, direction="vertical"))

windows()
gg_plot2

标签: rggplot2

解决方案


希望将数据重塑为长格式,尽管您不必使用melt或者gather如果您不想 - 您可以手动堆叠数据,例如

library(dplyr)
library(ggplot2)

new_df <- bind_rows(
  male = select(mean_behav_by_numweeks,
                numweeks_round,
                Mean_Behavior_Score = Mean_Behavior_Score_Male,
                nrow = nrow_male,
                lm_results_predict = lm_results_predict_male),
  female = select(mean_behav_by_numweeks,
                numweeks_round,
                Mean_Behavior_Score = Mean_Behavior_Score_Female,
                nrow = nrow_female,
                lm_results_predict = lm_results_predict_female),
  .id = "gender"
)

然后你可以做

ggplot(new_df, aes(numweeks_round, Mean_Behavior_Score, size = nrow, colour = gender)) + 
    geom_point() +
    theme(plot.title = element_text(size=10.9, hjust = 0.5),
          axis.text = element_text(size=8),
          legend.position="bottom") + 
    scale_size_continuous(range = c(1, 7)) +
    labs(x = "Number of weeks since 1st assessment",
         y = "Mean behavior assessment score",
         size="# members") +
    geom_line(aes(y = lm_results_predict), size = 1) +
    scale_color_manual(name = "GenderCode", labels = c("Female", "Male"), values = c("pink3", "steelblue2")) + 
    guides(color = guide_legend(order=1, direction="vertical")) +
    facet_wrap("gender")

这给了你

在此处输入图像描述


推荐阅读