2015-10-16 35 views
-1

我在ggplot2中使用動態列名稱,但有些名稱是表達式。在這種情況下,如何讓ggplot2使用表達式作爲列名?下面是一個例子。使用表達式作爲ggplot2中的列名稱

library(ggplot2) 
data <- data.frame(c(1,34,3,41,27,4,5,22), c(3,8,7,26,10,20,1,2)) 
names(data) <- c("name1", "name2") 
rndidx <- sample(2) 
ggplot(data, aes_string(names(data)[rndidx[1]])) + geom_line(aes_string(y=names(data)[rndidx[2]])) #This works fine 
names(data) <- c("name1", "log(1+name2)") 
ggplot(data, aes_string(names(data)[rndidx[1]])) + geom_line(aes_string(y=names(data)[rndidx[2]])) 
#Error in eval(expr, envir, enclos) : object 'name2' not found 

編輯:爲什麼我不能簡單地用其更容易處理列名的原因是因爲其繪製數據的功能(即存在包含一些呼叫ggplot一個繪圖功能)接收異構數據,其中列名時常變化,有時候是表情,有時候不是。我不希望結果圖扭曲標籤中的列名稱或其他地方,我可能想要在圖中使用它們。

+0

我不明白你想達到什麼目的。 – Roland

+0

如果您只想更改軸標籤,請使用'ylab'。 – Roland

+0

@Roland請參閱最新的描述。我希望能夠使用ggplot2繪製任意的東西而不會扭曲原始列名稱。不幸的是,我對列名沒有太多的控制。軸標籤只是我需要保持完整的示例。 – Datoraki

回答

1

你可以這樣做,但事先重命名變量會更容易。總之,這裏是一個辦法,

ggplot(data, aes_string(gsub("\"", "`", deparse(names(data)[rndidx[1]])))) + 
    geom_line(aes_string(y=gsub("\"", "`", deparse(names(data)[rndidx[2]])))) 

你基本上只需要找到一個辦法讓這種情況發生時aes_string求值的parse(text=左右。

+0

在我的情況下,不幸的是事先重命名變量,因爲我真的需要原始的變量名。該程序非常複雜,我有很多不同的列名,我無法輕鬆控制,每次都是不同的。但是,您的解決方案非常好,謝謝! – Datoraki

+0

太棒了!我只是重新編譯它,並意識到你在那裏有一個隨機索引,所以同樣需要爲第一個'aes_string'變量完成。 – jenesaisquoi

相關問題