Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何仅更改ggplot2'中一个值的颜色值;啤酒厂?_R_Ggplot2_Colors_Colorbrewer - Fatal编程技术网

R 如何仅更改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使用的颜色集来手动完成这

我有一个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
使用的颜色集来手动完成这项工作,然后预先设置黑色,并将其传递给
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()