2011-02-11 29 views
49

Hãy xem xét ví dụ này đơn giản:Kết hợp bột nhão() và biểu thức() chức năng trong âm mưu nhãn

labNames <- c('xLab','yLabl') 
plot(c(1:10),xlab=expression(paste(labName[1], x^2)),ylab=expression(paste(labName[2], y^2))) 

Những gì tôi muốn là cho các mục nhập nhân vật được định nghĩa bởi biến 'labName, 'xLab' hoặc 'yLab' xuất hiện bên cạnh X^2 hoặc y^2 được xác định bởi biểu thức(). Vì nó là, văn bản thực tế 'labName' với một subscript được tham gia vào biểu thức superscripted.

Mọi suy nghĩ?

Trả lời

49

Giải pháp thay thế cho @Aaron là chức năng bquote(). Chúng tôi cần cung cấp một biểu thức R hợp lệ, trong trường hợp này là LABEL ~ x^2 chẳng hạn, trong đó LABEL là chuỗi bạn muốn gán từ véc tơ labNames. bquote đánh giá mã R trong biểu thức được gói trong .() và đặt kết quả vào biểu thức.

Dưới đây là một ví dụ:

labNames <- c('xLab','yLab') 
xlab <- bquote(.(labNames[1]) ~ x^2) 
ylab <- bquote(.(labNames[2]) ~ y^2) 
plot(c(1:10), xlab = xlab, ylab = ylab) 

(Lưu ý ~ chỉ cần thêm một chút khoảng cách, nếu bạn không muốn không gian, thay thế nó với * và hai phần của biểu thức sẽ được đặt cạnh nhau .)

20

Sử dụng substitute để thay thế.

labNames <- c('xLab','yLab') 
plot(c(1:10), 
    xlab=substitute(paste(nn, x^2), list(nn=labNames[1])), 
    ylab=substitute(paste(nn, y^2), list(nn=labNames[2]))) 
+8

Các bạn có sinh đôi không? =) – aL3xa

3

Rất đẹp ví dụ sử dụng dán và thay thế để câu chữ cả hai ký hiệu (mathplot) và các biến tại http://vis.supstat.com/2013/04/mathematical-annotation-in-r/

đây là một sự thích nghi ggplot

library(ggplot2) 
x_mean <- 1.5 
x_sd <- 1.2 
N <- 500 

n <- ggplot(data.frame(x <- rnorm(N, x_mean, x_sd)),aes(x=x)) + 
    geom_bar() + stat_bin() + 
    labs(title=substitute(paste(
      "Histogram of random data with ", 
      mu,"=",m,", ", 
      sigma^2,"=",s2,", ", 
      "draws = ", numdraws,", ", 
      bar(x),"=",xbar,", ", 
      s^2,"=",sde), 
      list(m=x_mean,xbar=mean(x),s2=x_sd^2,sde=var(x),numdraws=N))) 

print(n) 
11

EDIT: thêm một ví dụ mới cho ggplot2 ở cuối

Xem plotmath cho các hoạt động toán học khác nhau trong R

Bạn sẽ có thể sử dụng biểu mà không dán?. Nếu bạn sử dụng biểu tượng tilda (~) trong hàm biểu thức, nó sẽ giả sử có khoảng trống giữa các ký tự hoặc bạn có thể sử dụng ký hiệu * và nó sẽ không đặt dấu cách giữa các đối số

Đôi khi bạn sẽ cần để thay đổi lề trong khi bạn đang đặt chữ trên trục y.

par(mar=c(5, 4.3, 4, 2) + 0.1) 
plot(c(1:10), xlab = expression(xLab ~ x^2 ~ m^-2), 
    ylab = expression(yLab ~ y^2 ~ m^-2), 
    main="Plot 1") 

enter image description here

plot(c(1:10), xlab = expression(xLab * x^2 * m^-2), 
    ylab = expression(yLab * y^2 * m^-2), 
    main="Plot 2") 

enter image description here

plot(c(1:10), xlab = expression(xLab ~ x^2 * m^-2), 
    ylab = expression(yLab ~ y^2 * m^-2), 
    main="Plot 3") 

enter image description here

Hy vọng rằng bạn có thể thấy sự khác biệt giữa các lô 1, 2 và 3 với những ứng dụng khác nhau của ~ và * biểu tượng. Một lưu ý thêm, bạn có thể sử dụng các biểu tượng khác như vẽ biểu tượng độ cho nhiệt độ hoặc mu, phi. Nếu bạn muốn thêm một chỉ số sử dụng dấu ngoặc vuông.

plot(c(1:10), xlab = expression('Your x label' ~ mu[3] * phi), 
    ylab = expression("Temperature (" * degree * C *")")) 

enter image description here

Dưới đây là một ví dụ ggplot sử dụng biểu với một ví dụ vô nghĩa

require(ggplot2) 

Hoặc nếu bạn có các thư viện pacman cài đặt bạn có thể sử dụng p_load để tự động tải về và tải và đính kèm thêm -on gói

# require(pacman) 
# p_load(ggplot2) 

data = data.frame(x = 1:10, y = 1:10) 

ggplot(data, aes(x,y)) + geom_point() + 
    xlab(expression(bar(yourUnits) ~ g ~ m^-2 ~ OR ~ integral(f(x)*dx, a,b))) + 
    ylab(expression("Biomass (g per" ~ m^3 *")")) + theme_bw() 

enter image description here

+0

Tôi đã bắt đầu sử dụng ggplot làm công cụ vẽ chính của mình và phương pháp này cũng hoạt động cho ggplot – anotherFishGuy

1

Nếu x^2 và y^2 là biểu thức đã được đưa ra trong biến bình phương, điều này giải quyết vấn đề:

labNames <- c('xLab','yLab') 
squared <- c(expression('x'^2), expression('y'^2)) 

xlab <- eval(bquote(expression(.(labNames[1]) ~ .(squared[1][[1]])))) 
ylab <- eval(bquote(expression(.(labNames[2]) ~ .(squared[2][[1]])))) 

plot(c(1:10), xlab = xlab, ylab = ylab) 

Xin lưu ý [[1]] đằng sau phương [1]. Nó cung cấp cho bạn nội dung của "biểu thức (...)" giữa các dấu ngoặc mà không có bất kỳ ký tự thoát nào.

Các vấn đề liên quan