如何使用ggplot绘制色轮?

时间:2014-01-31 21:17:05

标签: r graphics colors ggplot2

我正在阅读“ggplot2 - 用于数据分析的优雅图形”一书(Wickham,2009),“Scaling”(第32页)部分说明了这一点:

  

缩放然后涉及将数据值映射到此空间中的点。   有很多方法可以做到这一点,但是因为 cyl 是绝对的   变量我们将值映射到色轮上均匀分布的色调,如   如图3.4所示。变量为时使用不同的映射   连续。这些转换的结果如表3.4所示   包含对计算机有意义的值。

enter image description here

enter image description here

这本书没有详细解释如何获得这个表3.4,更不用说3.4了。内置数据库是 mpg 。任何人都知道如何获得此表格和图表? 提前谢谢。

2 个答案:

答案 0 :(得分:11)

想知道如何在没有coord_polar()的情况下做到这一点,因为Wickham的书中的例子显然没有。事实证明你可以使用geom_point(...)

library(ggplot2)
r  <- seq(0,1,length=201)
th <- seq(0,2*pi, length=201)
d  <- expand.grid(r=r,th=th)
gg <- with(d,data.frame(d,x=r*sin(th),y=r*cos(th),
                        z=hcl(h=360*th/(2*pi),c=100*r, l=65)))
ggplot(gg) +
  geom_point(aes(x,y, color=z), size=3)+
  scale_color_identity()+labs(x="",y="") +
  coord_fixed()

这会在几秒钟内呈现。 This reference表示默认亮度,l = 65。

答案 1 :(得分:9)

这与您正在寻找的内容非常接近,但颜色过渡可能不够顺畅。希望其他人可以改进这一点:

代码改编自here

# Create hsv grid
d = expand.grid(h=seq(0,1,0.01), s=seq(0,1,0.05), v=1)

p1 = ggplot() +
          coord_polar(theta="x") +
          scale_x_continuous(breaks=NULL) +
          scale_y_continuous(breaks=NULL) +
          scale_fill_identity() +
          geom_rect(data=d, mapping=aes(xmin=h, xmax=h+resolution(h), 
                                        ymin=s, ymax=s+resolution(s), 
                                        fill=hsv(h,s,v)))

通过为hs值使用更精细的网格,可以获得更平滑的颜色过渡,但渲染绘图需要很长时间。您可以通过将v的值设置为0到1来更改亮度。(Per @ BrodieG的注释,设置v = 1/2以获得Hadley的ggplot2书中图形的亮度级别。)

以下是使用h值的步长0.001的图表版本(同时将s步长保持为0.05)。在我相对较新的Macbook Pro上渲染需要花费几分钟时间,但h坐标上的过渡非常平滑:

png("Colour wheel.png", 2000, 2000) 
p1
dev.off()

enter image description here

要获取颜色表,可以使用hsv()函数,该函数返回十六进制颜色值。例如:

# Make up some hsv colors
colors = data.frame(h=seq(0.1,0.5,length.out=6), 
                    s=seq(0.5,0.9,length.out=6), 
                    v=c(.5,.5,.5,.9,.9,.9))

# Convert to hexadecimal
apply(colors, 1, function(x) hsv(x[1],x[2],x[3]))
[1] "#806640" "#7A8036" "#50802B" "#3CE642" "#29E68B" "#17E6E6"

# Plot them to see what they look like
plot(1:6,rep(1,6), pch=15, cex=5, col=apply(colors, 1, function(x) hsv(x[1],x[2],x[3])))