0

この質問は、私がここで尋ねた質問に関連しています。データフレームの列で指定された色で散布図の個々の点に色を付けようとしています。データはタブ区切りファイルからのものであり、次のようになります。

> dput(ztestHSV)
structure(list(y = c(0, -1, -1, -2), x = c(0, 2, 0, -2), group = c("m", 
"m", "m", "s"), colorHSV = c("0.02,0.83,0.89", "0.59,0.59,0.85", 
"0.25,0.45,0.8", "0.55,0.41,0.8"), colorText = c("red", "blue", 
"green", "turquoise")), .Names = c("y", "x", "group", "colorHSV", 
"colorText"), class = "data.frame", row.names = c(NA, -4L))

すなわち

   y  x group  colorHSV       colorText
1  0  0     m  0.02,0.83,0.89       red
2 -1  2     m  0.59,0.59,0.85      blue
3 -1  0     m  0.25,0.45,0.8      green
4 -2 -2     s  0.55,0.41,0.8  turquoise

次のコードは、Rで使用可能な事前定義された色のセットに対して適切に機能します。

ztestHSV=read.table(file="testHSV.txt",sep="\t",header=TRUE,
                    colClasses=c("numeric","numeric","character","character","character"))

plot(ztestHSV[ztestHSV$group=='m',]$x,ztestHSV[ztestHSV$group=='m',]$y,type='n')
points(ztestHSV[ztestHSV$group=='m',]$x,ztestHSV[ztestHSV$group=='m',]$y,
       pch=23,cex=1.5,
       bg=ztestHSV[ztestHSV$group=='m',]$colorText
)

私が本当にやりたいのはhsv()、色を指定するために使用することです。bgしかし、それを機能させるための正しいコマンドを理解することはできません。私はいくつかのことを試し、それらを関連する結果とともに以下にリストしました。

1

bg=hsv(as.numeric(ztestHSV$colorHSV))

Error in hsv(as.numeric(ztestHSV$colorHSV)) : 
bad hsv to rgb color conversion
In addition: Warning message:
In hsv(as.numeric(ztestHSV$colorHSV)) : NAs introduced by coercion

2

bg=hsv(as.numeric(strsplit(ztestHSV$colorHSV,",")))

Error in hsv(as.numeric(strsplit(ztestHSV$colorHSV, ","))) : 
(list) object cannot be coerced to type 'double'

3

bg=hsv(unlist(strsplit(ztestHSV$colorHSV,",")))

上記は実行されますが、間違った背景色を使用しています

4

bg=hsv(as.numeric(unlist(strsplit(ztestHSV$colorHSV,","))))

上記はエラーを生成しませんが、背景色を塗りつぶしません

これはcolorHSVの文字列をhsv()使用できるものに変換する際の問題のようですが、その方法がわかりません。どんな助けでも素晴らしいでしょう。

4

2 に答える 2

1

dput()使用しているデータを表示するようなものを使用して、簡単に再現できる例を提供すると役立ちます。

> dput(ztestHSV)
structure(list(y = c(0L, -1L, -1L, -2L), x = c(0L, 2L, 0L, -2L
), group = structure(c(1L, 1L, 1L, 2L), .Label = c("m", "s"), class = "factor"), 
    colorHSV = c("0.02,0.83,0.89", "0.59,0.59,0.85", "0.25,0.45,0.8", 
    "0.55,0.41,0.8"), colorText = structure(c(3L, 1L, 2L, 4L), .Label = c("blue", 
    "green", "red", "turquoise"), class = "factor")), .Names = c("y", 
"x", "group", "colorHSV", "colorText"), row.names = c(NA, -4L
), class = "data.frame")

文字列のベクトルを数値のリストに変換してから、次のようにそれぞれdo.call()を呼び出すために使用できます。hsv()

> bg <- sapply(strsplit(ztestHSV$colorHSV, ","), function(x) do.call(hsv, as.list(as.numeric(x))))
> dput(bg)
c("#E33D27", "#5994D9", "#9ECC70", "#78B3CC")
> plot(1:4, pch = 21, cex = 20, bg = bg)
于 2012-06-11T03:54:59.700 に答える
0

その1つの列を3つの別々の列に分割し、それぞれをに渡す必要がありますhsv。(私が知っている)それを行う最も便利な方法は、 reshape2colsplitから使用することです:

> hsvCols <- reshape2::colsplit(ztestHSV$colorHSV,",",names = c('h','s','v'))
> with(hsvCols,hsv(h,s,v))
[1] "#E33D27" "#5994D9" "#9ECC70" "#78B3CC"

そして、それらをに割り当ててbgプロットすることができます。これにより、入力がかなり節約され、値を数値に明示的に強制変換する必要がなくなることに注意してください。

于 2012-06-11T03:55:42.107 に答える