Reputation: 24535
I have following data.frame with rgb values. Hence each row indicates a color.
pdf <- read.table(header = TRUE, text = "
r g b
0.374 0.183 0.528
0.374 0.905 0.337
0.051 0.662 0.028
0.096 0.706 0.898
0.876 0.461 0.628
0.415 0.845 0.286
0.596 0.07 0.523
0.724 0.101 0.673
0.847 0.434 0.937
0.588 0.885 0.604
0.481 0.366 0.337
0.142 0.075 0.276
0.819 0.737 0.658
0.91 0.722 0.979
0.969 0.012 0.451
0.887 0.536 0.123
0.432 0.967 0.446
0.927 0.125 0.332
0.381 0.646 0.656
0.04 0.898 0.798
")
How can I visualize these colors? This can be either as bars of color or a palette or a pie chart. I tried to use following method but could not fit it in my data:
pie(rep(1,20), col=rainbow(20))
Upvotes: 30
Views: 36251
Reputation: 140
You can use the hues package:
library("hues")
pal <- c("#351d34", "#f5ccb5", "#159ea2", "#d05d6c", "#ec4934")
swatch(pal)
Upvotes: 3
Reputation: 101
Convert to R color with rgb(), plot with ggplot using geom_tile (extending the answer from @Matifou), and add text label.
With the original post data:
# a palette is a named vector
myPalette=rgb(pdf)
names(myPalette) = paste("row", 1:nrow(pdf))
# create data that references the palette
colorKey = data.frame(colorName=names(myPalette))
# plot with ggplot, referencing the palette
ggplot(data=colorKey, aes(x=1, y = 1:nrow(colorKey), fill=colorName, label=colorName)) +
geom_tile() +
scale_fill_manual(values = myPalette) +
theme_void()+
theme(legend.position="none") +
geom_text()
SECOND EXAMPLE - for text labels
myPalette = c(
buttercup = "#6AD749",
bubbles = "#18B4E5",
blossum = "#DF76A0")
colorKey = data.frame(colorName=names(myPalette))
ggplot(data=colorKey, aes(x=1, y = 1:nrow(colorKey), fill=colorName, label=colorName)) +
geom_tile() +
scale_fill_manual(values = myPalette) +
theme_void()+
theme(legend.position="none") +
geom_text()
Upvotes: 2
Reputation: 924
I think the simplest option is scales. This also has the advantage of showing the hex values in the colours.
library(scales)
pal <- rgb(ddf$r, ddf$g, ddf$b)
show_col(pal)
Upvotes: 64
Reputation: 8880
You could also use ggplot2
:
library(ggplot2)
qplot(x=1:nrow(ddf), y = 1, fill=factor(1:nrow(ddf)), geom="tile") +
scale_fill_manual(values = rgb(ddf$r, ddf$g, ddf$b)) +
theme_void()+
theme(legend.position="none")
Upvotes: 4
Reputation: 14957
As an alternative to the solution using image
you could also use polygon
and create a quite similar plot:
plot(NA, xlim=c(0, nrow(ddf)), ylim=c(0,1))
for (i in 1:nrow(ddf)) {
row <- ddf[i,]
color <- rgb(red=row$r, green=row$g, blue=row$b)
polygon(x=c(i-1, i, i, i-1), y=c(0, 0, 1, 1), col = color)
}
Upvotes: 5
Reputation: 78792
image()
will work well here if you convert the colors via rgb()
image(1:nrow(ddf), 1, as.matrix(1:nrow(ddf)),
col=rgb(ddf$r, ddf$g, ddf$b),
xlab="", ylab = "", xaxt = "n", yaxt = "n", bty = "n")
Upvotes: 16