R 如何仅更改ggplot2'中一个值的颜色值;啤酒厂?
我有一个R数据框(df),我正在ggplot2中以条形图的形式绘制,并基于数据框中的一列进行着色(R 如何仅更改ggplot2'中一个值的颜色值;啤酒厂?,r,ggplot2,colors,colorbrewer,R,Ggplot2,Colors,Colorbrewer,我有一个R数据框(df),我正在ggplot2中以条形图的形式绘制,并基于数据框中的一列进行着色(df$type)。现在,我正在使用默认的着色模式(scale\u fill\u brewer)来分配颜色 如何将黑色分配给一个值(df$type==-1),并使用scale\u fill\u brewer分配其余颜色?(所有其他df$类型都是一组从1到X的整数中的a,其中X是唯一值的数目) 到目前为止,我已经能够通过计算N个不同项目的scale\u fill\u brewer使用的颜色集来手动完成这
df$type
)。现在,我正在使用默认的着色模式(scale\u fill\u brewer
)来分配颜色
如何将黑色分配给一个值(df$type==-1
),并使用scale\u fill\u brewer分配其余颜色?(所有其他df$类型
都是一组从1到X的整数中的a,其中X是唯一值的数目)
到目前为止,我已经能够通过计算N个不同项目的scale\u fill\u brewer
使用的颜色集来手动完成这项工作,然后预先设置黑色,并将其传递给scale\u fill\u manual
rhg_cols1<- c("#000000","#F8766D","#7CAE00","#00BFC4","#C77CFF" )
ggplot(y=values,data=df, aes(x=name, fill=factor(type))) +
geom_bar()+ scale_fill_manual(values = rhg_cols1)
谢谢大家!
编辑:该解决方案必须适用于30多种颜色,并适用于ColorBrewer的“Set2”程序包
RColorBrewer
包含调色板,您可以使用函数brewer.pal
返回您选择的调色板
例如,5种颜色的连续蓝色调色板:
library(RColorBrewer)
my.cols <- brewer.pal(5, "Blues")
my.cols
[1] "#EFF3FF" "#BDD7E7" "#6BAED6" "#3182BD" "#08519C"
如果你需要区分这么多(30+)个不同的类别,你可能需要备份并花更多的时间从战略上思考项目:几乎不可能想出一套30个实际可区分的colo(u)R(特别是以独立于平台/渲染通道的方式) 基本上没有一种解决方案可以与
Set2
和30+颜色一起使用。一些CB调色板(Set3
和Paired
;library(RColorBrewer);display.brewer.all(n=12)
)允许多达12种颜色
编辑:OP希望使用良好的、可分辨的颜色进行探索性数据分析,如果碰巧有很多类别,这些颜色不会断裂。我会提出以下建议:
library(RColorBrewer)
my.cols <- function(n) {
black <- "#000000"
if (n <= 9) {
c(black,brewer.pal(n-1, "Set2"))
} else {
c(black,hcl(h=seq(0,(n-2)/(n-1),
length=n-1)*360,c=100,l=65,fixup=TRUE))
}
}
library(ggplot2)
d <- data.frame(z=1:10)
g1 <- qplot(z,z,data=d,colour=factor(z))+opts(legend.position="none")
g1 + scale_colour_manual(values=my.cols(9))
g1 + scale_colour_manual(values=my.cols(10))
## check that we successfully recreated ggplot2 internals
## g1+scale_colour_discrete()
库(RColorBrewer)
非常感谢您的详细回复。不幸的是,Set2只返回8种颜色,在某些情况下,我的颜色不止这些。是的,据我所知,几乎所有的ColorBrewer调色板都有8种颜色的上限。你也可以试试scale\u fill\u hue
scale\u fill\u hue
比我现在使用的颜色更难区分颜色。我可能会做的是从几组不同的颜色中获取颜色,将它们全部推到一起,预涂黑色并使用它…我还不确定,这正进入我的周末项目……一个更有趣/更具挑战性的解决方案是找到一组点,这些点都在亮度=65的HCL楔形范围内,并且间隔尽可能均匀/远。不平凡……继@Ben的上述评论之后,colorspace软件包中的rainbow_hcl
可以轻松构建均匀分布hcl颜色的托盘。例如:library(colorspace);绘图(1:10,col=rainbow_hcl(n=10,c=100,l=65),pch=16,cex=6)
。这是我上述即兴评论的一个很好的实现。我认为,rainbow\u hcl
,就像ggplot的配色方案一样,在适当的颜色空间边缘提供等间距的值。。。很好,但不是我想的那样,即用均匀间隔的点填充颜色空间。这并不是问题的答案。这是在添加比例*.\u手册
层之前,重新分配整个颜色比例,该比例可能与当前图形中使用的比例相同,也可能不同。以上当然是一个有用的例子,但是有没有办法获取当前的颜色比例,根据需要修改(一种颜色,如问题中所述),然后再添加回该层?或者其他一些只改变当前比例的一个元素而不改变其他元素的方法?“我想要色调”的工作本机R实现是。还有rwanthue,但它在V8中运行javascript,不容易在OSX上安装。我只是想知道同样的问题。如果scale\u fill\u manual()。
my.cols[1] <- "#000000"
library(ggplot2)
df <- data.frame(x=1:5, type=1:5)
ggplot(df, aes(x=x, fill=factor(type))) +
geom_bar(binwidth=1)+
scale_fill_manual(values = my.cols)
library(RColorBrewer)
my.cols <- function(n) {
black <- "#000000"
if (n <= 9) {
c(black,brewer.pal(n-1, "Set2"))
} else {
c(black,hcl(h=seq(0,(n-2)/(n-1),
length=n-1)*360,c=100,l=65,fixup=TRUE))
}
}
library(ggplot2)
d <- data.frame(z=1:10)
g1 <- qplot(z,z,data=d,colour=factor(z))+opts(legend.position="none")
g1 + scale_colour_manual(values=my.cols(9))
g1 + scale_colour_manual(values=my.cols(10))
## check that we successfully recreated ggplot2 internals
## g1+scale_colour_discrete()