Цветовые точки ggplot на основе определенных цветовых кодов - PullRequest
2 голосов
/ 22 марта 2012

Можно ли использовать ggplot для окраски точек на основе предварительно определенных стандартных цветовых кодов, содержащихся во фрейме данных?

Ниже приведены некоторые примеры данных и код, чтобы помочь сформулировать мой вопрос.

tick  <- c("GE","APPL","GM","BTU","WMT","JPM","LUV")
price <- c(22,900,20,22,80,31,35)
volume<- c(300,500,100,107,400,300,325)
df1 <- data.frame(ticker=tick, price=price, volume=volume)

#  Here is a sample chart without colors:
p <- ggplot(df1, aes(volume, price))+ 
  geom_point();
p

#  I could use astetics and color_brewer to color points by ticker.
#  But since I want to have my colors uniform across multiple plots 
#  outside of this script, I have specified the colors to always 
#  be used for certian tickers   

## color speciciations
## http://wiki.stdout.org/rcookbook/Graphs/Colors%20(ggplot2)/#rcolorbrewer-palette-chart 

tick<-c("GE","APPL","GM","BTU","WMT")
ccodes<-c("#3399FF", "#FF000", "#CC00FF", "#993300", "#66CC00")
cnames<-c("blue", "red", "purple", "brown", "green")
df2=data.frame(ticker=tick, color.codes=ccodes, color.names=cnames)

## merge color specifcations into data
df3 <-merge(df1,df2, by=("ticker"), all.x=TRUE, all.y=TRUE)

# since I wont be able to specify colors for all the data will be 
# be plotting I need to speficy a default color, in this case black.
# this is where I start to run into trouble.  For some reason the 
# following line dosent work as i would have intended as it dosent
# correctly bring back the defined colors.
df3$color.code.new <- ifelse(is.na(df3$color.codes), "#000000", df3$color.codes) 

# Once that is corrected, I would like to use the new color codes
# in df3 as the colors of the points.
p <- ggplot(df3, aes(volume, price))+ 
  geom_point(); 
p

Любое руководство будет с благодарностью.

#####################################################################
#####  Edit below  - to test
#####################################################################
ccodes<-c("#990000", "#990000", "#990000", "#990000", "#990000")

1 Ответ

5 голосов
/ 22 марта 2012

Строка, которую вы заявили, не работает:

df3$color.code.new <- ifelse(is.na(df3$color.codes), "#000000", df3$color.codes)

работает для меня, хотя я думаю, что вы пропустили цифру в одном из ваших шестнадцатеричных цветов.Как только вы это исправите, вы просто хотите использовать scale_colour_manual с чем-то вроде этого:

tick  <- c("GE","APPL","GM","BTU","WMT","JPM","LUV")
price <- c(22,900,20,22,80,31,35)
volume<- c(300,500,100,107,400,300,325)
df1 <- data.frame(ticker=tick, price=price, volume=volume)

tick<-c("GE","APPL","GM","BTU","WMT")
ccodes<-c("#3399FF", "#FF0000", "#CC00FF", "#993300", "#66CC00")
cnames<-c("blue", "red", "purple", "brown", "green")
df2=data.frame(ticker=tick, color.codes=ccodes, color.names=cnames)

## merge color specifcations into data
df3 <-merge(df1,df2, by=("ticker"), all.x=TRUE, all.y=TRUE)
df3$color.code.new <- ifelse(is.na(df3$color.codes), "#000000", df3$color.codes) 

p <- ggplot(df3, aes(volume, price,colour = ticker))+ 
         geom_point() 
p + scale_colour_manual(breaks = df3$ticker,values = df3$color.code.new)

enter image description here

...