15

a の列名がdata.frame数字で始まっている場合、またはスペースが含まれているaes_string()場合、それらを処理できません。

foo=data.frame("1st Col"=1:5, "2nd Col"=5:1, check.names=F)
bar=colnames(foo)
ggplot(foo, aes_string(x=bar[1],y=bar[2])) + geom_point()
# Error in parse(text = x) : <text>:1:2: unexpected symbol
# 1: 1st
#     ^

foo=data.frame("First Col"=1:5, "Second Col"=5:1, check.names=F)
bar=colnames(foo)
ggplot(foo, aes_string(x=bar[1],y=bar[2])) + geom_point()
# Error in parse(text = x) : <text>:1:7: unexpected symbol
# 1: First Col
#          ^

foo=data.frame("First_Col"=1:5, "Second_Col"=5:1, check.names=F)
bar=colnames(foo)
ggplot(foo, aes_string(x=bar[1],y=bar[2]))+geom_point()
# Now it works

ここに画像の説明を入力

列名にスペースを含める方法はありますか、それとも数字で始まり、ggplot2 で使用できますか? 列名がわからない可能性があることを考慮してください。そのため、以下のような定数列名の例を提供することは避けてください。

aes_string(x=`1st Col`, y=`2nd Col`)
4

4 に答える 4

10

私の知る限り、このメソッドはプログラムで機能するはずです。

foo=data.frame("1st Col"=1:5, "2nd Col"=5:1, check.names=F)

#Save the colnames
bar=colnames(foo)

#change the names to something usable
names(foo) <- c("col1", "col2")

#Plot with arbitrary labs
ggplot(foo, aes(x=col1, y=col2)) + geom_point()+
  labs(x=bar[1], y=bar[2])

ここに画像の説明を入力してください

于 2012-11-18T23:50:50.500 に答える
8

元の質問では、変数の値を変更して、値が事前にわからない場合に ggplot() を受け入れられるようにする方法を尋ねました。

変数の値の先頭と末尾にバックティックを追加する関数を作成します。

# ggName -> changes a string so it is enclosed in back-ticks.
#   This can be used to make column names that have spaces (blanks)
#   or non-letter characters acceptable to ggplot2.
#   This version of the function is vectorized with sapply.
ggname <- function(x) {
    if (class(x) != "character") {
        return(x)
    }
    y <- sapply(x, function(s) {
        if (!grepl("^`", s)) {
            s <- paste("`", s, sep="", collapse="")
        }
        if (!grepl("`$", s)) {
            s <- paste(s, "`", sep="", collapse="")
        }
    }
    )
    y 
}

例:

ggname(12)

[1] 12

ggname("awk ward")

「`awk病棟`」

l <- c("awk ward", "no way!")
ggname(l)

「`awk ward`」「`まさか!`」

于 2015-05-10T13:40:25.310 に答える
0

同様の状況があり、「理解するために `` を使用しました。

mydf$ROIs <- row.names(mydf)
df.long <- melt(mydf)
colnames(df.long)[3] <- "Methods"
colnames(df.long)[4] <- "Mean L2 Norm Error"
variable.name="Variable", na.rm=TRUE)
ggplot(df.long, aes(ROIs, `Mean L2 Norm Error`, fill=Methods))+  
geom_bar(stat="identity",position="dodge")+
theme(axis.text.x=element_text(angle=45,hjust=1,vjust=1))
于 2016-11-10T03:35:16.250 に答える