将调色板分配给ggplot2中的元素

3

我正在使用代码生成游泳者图,但遇到了定制困难。在有3个分期类别的情况下,颜色太相似了。我该如何在 aes 中设置调色板,但保持元素长度一致?

swimmer's plot - teal on teal

尝试使用colorRampPalette(c("blue","red"))((length(dat$Subject)))代替color=variable。

set.seed(33)
dat = data.frame(Subject = 1:10, 
                 Months = sample(4:20, 10, replace=TRUE),
                 Treated=sample(0:1, 10, replace=TRUE),
                 Stage = sample(1:3, 10, replace=TRUE),
                 Continued=sample(0:1, 10, replace=TRUE))

dat = dat %>%
  group_by(Subject) %>%
  mutate(Complete=sample(c(4:(max(Months)-1),NA), 1, 
                         prob=c(rep(1, length(4:(max(Months)-1))),5), replace=TRUE),
         Partial=sample(c(4:(max(Months)-1),NA), 1, 
                        prob=c(rep(1, length(4:(max(Months)-1))),5), replace=TRUE),
         Durable=sample(c(-0.5,NA), 1, replace=TRUE))

# Order Subjects by Months
dat$Subject = factor(dat$Subject, levels=dat$Subject[order(dat$Months)])

# Melt part of data frame for adding points to bars
dat.m = melt(dat %>% select(Subject, Months, Complete, Partial),
             id.var=c("Subject","Months"))

ggplot(dat, aes(Subject, Months)) +
  geom_bar(stat="identity", aes(fill=factor(Stage)), width=0.7) +
  geom_point(data=dat.m, 
             aes(Subject, value, colour=variable, shape=variable), size=4) +
  geom_segment(data=dat %>% filter(Continued==1), 
               aes(x=Subject, xend=Subject, y=Months + 0.1, yend=Months + 1), 
               pch=15, size=0.8, arrow=arrow(type="closed", length=unit(0.1,"in"))) +
  coord_flip() +
  scale_fill_manual(values=hcl(seq(15,375,length.out=5)[1:4],100,70)) +
  scale_colour_manual(values=c(hcl(seq(15,375,length.out=3)[1:2],100,40),"black")) +
  scale_y_continuous(limits=c(0,20), breaks=0:20) +
  labs(fill="Disease Stage", colour="", shape="", 
       x="Subject Recevied Study Drug") +
  theme_bw() +
  theme(panel.grid.minor=element_blank(),
        panel.grid.major=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank())

我看了一下,颜色完全不相似 - 可能有点刺眼,但并不相似。所以我不知道你的问题到底是什么。你能更具体一些吗?也许发布一张图片? - Mike Wise
据我所知,pch=15除了引起形状警告之外似乎没有任何作用。您可以在geom_point调用中添加一个na.rm=T参数来避免NA移除警告。 - Mike Wise
谢谢Mike。我已经在teal上使用了teal。请参见上面的截图。 - sm002
那你是指深青色三角形在浅青色条形上的位置吗?在我的屏幕上它们很容易区分。 - Mike Wise
这样写有什么问题吗:scale_colour_manual(values=c("darkblue","darkred")) - Mike Wise
屏幕是可以的,但将其放大到海报上并不理想。由此我得到了以下错误提示:“警告:忽略未知参数:形状 错误:美学必须是长度为1或与数据(14)相同的x、y、颜色、形状。” - sm002
1个回答

1
我进行了以下修改:
  • 删除了geom_segment调用中的pch=参数,因为它不是geom_segment参数。
  • set_colour_manual调用更改为将两种颜色明确设置为darkbluedarkred。这些控制符号的颜色。
  • geom_point调用中添加了一个na.rm=T参数,以抑制发出的缺失值警告。
生成的代码如下:
library(ggplot2)
library(dplyr)
library(reshape2)
set.seed(33)
dat = data.frame(Subject = 1:10, 
                 Months = sample(4:20, 10, replace=TRUE),
                 Treated=sample(0:1, 10, replace=TRUE),
                 Stage = sample(1:3, 10, replace=TRUE),
                 Continued=sample(0:1, 10, replace=TRUE))

dat = dat %>%
  group_by(Subject) %>%
  mutate(Complete=sample(c(4:(max(Months)-1),NA), 1, 
                         prob=c(rep(1, length(4:(max(Months)-1))),5), replace=TRUE),
         Partial=sample(c(4:(max(Months)-1),NA), 1, 
                        prob=c(rep(1, length(4:(max(Months)-1))),5), replace=TRUE),
         Durable=sample(c(-0.5,NA), 1, replace=TRUE))

# Order Subjects by Months
dat$Subject = factor(dat$Subject, levels=dat$Subject[order(dat$Months)])

# Melt part of data frame for adding points to bars
dat.m = melt(dat %>% select(Subject, Months, Complete, Partial),
             id.var=c("Subject","Months"))

ggplot(dat, aes(Subject, Months)) +
  geom_bar(stat="identity", aes(fill=factor(Stage)), width=0.7) +
  geom_point(data=dat.m, na.rm=T,
             aes(Subject, value, colour=variable, shape=variable), size=4) +
  geom_segment(data=dat %>% filter(Continued==1), 
               aes(x=Subject, xend=Subject, y=Months + 0.1, yend=Months + 1), 
               size=0.8, arrow=arrow(type="closed", length=unit(0.1,"in"))) +
  coord_flip() +
  scale_fill_manual(values=hcl(seq(15,375,length.out=5)[1:4],100,70)) +
  scale_colour_manual(values=c("darkblue","darkred")) +
  scale_y_continuous(limits=c(0,20), breaks=0:20) +
  labs(fill="Disease Stage", colour="", shape="", 
       x="Subject Recevied Study Drug") +
  theme_bw() +
  theme(panel.grid.minor=element_blank(),
        panel.grid.major=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank())

这将在没有警告的情况下在 ggplot 2.2.1 上创建以下图表。

enter image description here

当然,我没有看到你提到的所有警告,所以可能需要检查版本。这是我的 sessionInfo()

enter image description here


错误是由于颜色缩放的误用。谢谢,看起来好多了。为了改善分组,我想按照阶段的降序月数对它们进行排序,并在这些阶段组之间留出稍大的间隔。分配这些级别的最佳方法是什么?dat$Subject[order(dat$Stage[order(dat$Months,decreasing = TRUE)])]) - sm002
使用 dat$Subject = factor(dat$Subject, levels=dat$Subject[order(dat$Months,decreasing = T)]) 可以很好地反转顺序,将图形从上到下翻转。您可以通过调整 width=0.7 的值来改变条形的宽度。 - Mike Wise
此外,图例有两个部分——舞台和CR/PR。当我使用legend.position = c(0.9, 1.1)时,会丢失舞台部分。我尝试在labs(fill="Disease Stage", colour="", shape="", x="Subject Recevied Study Drug")中添加position=c(0.9,0.8)。 - sm002
标签是非常脆弱的东西,这也是ggplot的主要问题之一,尽管它比大多数软件包做得更好。实验是前进的唯一途径,但你可能会在那里花费很多时间。 - Mike Wise

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接