首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何控制ggrepel片段的颜色

如何控制ggrepel片段的颜色
EN

Stack Overflow用户
提问于 2020-07-21 22:16:54
回答 1查看 191关注 0票数 3

我将在一个更好的MRE...for环境中再次尝试,下面是我目前正在尝试改进的产品

我要做的是让从端点到标签的线条与数据线的颜色相同。

对于这个问题,我们可以使用这个脚本

代码语言:javascript
复制
library(ggplot2)
library(babynames)
library(dplyr)
library(ggrepel)
library(ggsci)

data <- babynames %>%
  filter(name %in% c("Ashley", "Patricia", "Mary", "Minnie")) %>%
  filter(sex=="F")

data <- data %>% group_by(name) %>%
  mutate(change = n - lag(n)) %>% 
  mutate(meanC = mean(change, na.rm = TRUE)) %>%
  ungroup()

data$label <- paste(data$name,"\n",round(data$meanC,0),sep="" )  

minYear = min(data$year)
maxYear = max(data$year)

#endpoint layer
Endpoints <- data %>% 
  group_by(name) %>%
  filter(year == max(year)) %>%
  select(year, name, n, label) %>%
  ungroup()
         
namePlot <- data %>%
  ggplot(mapping = aes(x=year, y=n)) +
  geom_line(aes(color=name), show.legend = FALSE) +
  coord_cartesian(xlim = c(minYear, maxYear+10)) +
  scale_color_ucscgb() +
  geom_point(data = Endpoints, size=1.5, shape=21,
            aes(color=name, fill=name), show.legend=FALSE) +
  geom_label_repel(data=Endpoints, aes(label=label),
                  color = c("forestgreen","red")[1+grepl("\\-\\d",Endpoints$label)],
                  show.legend = FALSE,
                  vjust = 0, xlim=c(maxYear+3,maxYear+10), size=3, direction='y')
         
print(namePlot)

它会生成下面的图

标签的颜色由color = c("forestgreen","red")[1+grepl("\\-\\d",Endpoints$label)],控制,因此,在这种情况下,标签中具有正值的数据为绿色,具有负值的数据为红色。我想要的是使从端点到标签框的连接线与由geom_line(aes(color=name),show.legend = FALSE控制的数据线的颜色相同

ggrepel文档中,有一个segment.color参数可以控制线段的颜色,但它不是美观的。所以看起来它必须是像segment.color="red"这样的“硬编码”,这对我没有真正的帮助。我也找到了关于这个问题的this discussion,似乎提出了一个解决方案,但我一直无法让它工作。问题的一部分是它涉及到scale_color_discrete(aesthetics = c("color", "segment.color")),而我已经有了scale_color_ucscgb(),所以我收到了关于更换scales的警告……

任何指导都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2020-09-01 00:26:39

基于@aosmith的指导的工作版本

代码语言:javascript
复制
library(ggplot2)
library(babynames)
library(dplyr)
library(ggrepel)
library(ggsci)

data <- babynames %>%
  filter(name %in% c("Ashley", "Patricia", "Mary", "Minnie")) %>%
  filter(sex=="F")

data <- data %>% group_by(name) %>%
  mutate(change = n - lag(n)) %>% 
  mutate(meanC = mean(change, na.rm = TRUE)) %>%
  ungroup()

data$label <- paste(data$name,"\n",round(data$meanC,0),sep="" )  

minYear = min(data$year)
maxYear = max(data$year)

#endpoint layer
Endpoints <- data %>% 
  group_by(name) %>%
  filter(year == max(year)) %>%
  select(year, name, n, label) %>%
  ungroup()

namePlot <- data %>%
  ggplot(mapping = aes(x=year, y=n)) +
  geom_line(aes(color=name), show.legend = FALSE) +
  coord_cartesian(xlim = c(minYear, maxYear+15)) +
  geom_point(data = Endpoints, size=1.5, shape=21,
             aes(color=name, fill=name), show.legend=FALSE) +
  geom_label_repel(data=Endpoints, aes(label=label,
                                       segment.color=name),
                   color = c("forestgreen","red")[1+grepl("\\-\\d",Endpoints$label)],
                   show.legend = FALSE,
                   force = 50, 
                   vjust = 0, xlim=c(maxYear+5,maxYear+12), size=3, direction='y') +
  scale_color_discrete(aesthetics = c("color", "segment.color"))

print(namePlot)

产生

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63016560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档