Объединение функций paste () и expression () в метках графика - PullRequest
61 голосов
/ 11 февраля 2011

Рассмотрим этот простой пример:

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

Я хочу, чтобы символьная запись, определенная переменной 'labName,' xLab 'или' yLab ', появилась рядом с X ^ 2 или y ^2 определяется выражением ().Как таковой, фактический текст 'labName' с нижним индексом присоединяется к надстрочному выражению.

Есть мысли?

Ответы [ 5 ]

62 голосов
/ 14 февраля 2011

Альтернативным решением для @Aaron является функция bquote().Нам нужно предоставить правильное выражение R, в данном случае LABEL ~ x^2, например, где LABEL - строка, которую вы хотите присвоить из вектора labNames.bquote оценивает R-код в выражении, заключенном в .( ), и подставляет результат в выражение.

Вот пример:

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

(Обратите внимание, что ~ просто добавляетнемного пробела, если вам не нужен пробел, замените его на *, и две части выражения будут сопоставлены.)

26 голосов
/ 12 февраля 2011

Используйте substitute вместо.

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])))
21 голосов
/ 08 сентября 2015

EDIT: добавлен новый пример для ggplot2 в конце

См. ? Plotmath для различных математических операций в R

Вы должны иметь возможность использовать выражение безвставить.Если вы используете символ тильды (~) в функции выражения, он будет предполагать, что между символами есть пробел, или вы можете использовать символ *, и он не будет ставить пробел между аргументами

Иногда выВам нужно будет изменить поля, когда вы ставите верхние индексы на оси Y.

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

enter image description here

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

enter image description here

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

enter image description here

Надеемся, вы сможете увидеть различия между графиками 1, 2 и 3 при различном использовании ~ и *символы.Дополнительное примечание, вы можете использовать другие символы, такие как нанесение символа градуса для температуры или му, фи.Если вы хотите добавить индекс, используйте квадратные скобки.

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

enter image description here

Вот пример ggplot, использующий выражение с бессмысленным примером

require(ggplot2)

Или, если у вас установлена ​​библиотека pacman, вы можете использовать p_load для автоматической загрузки, загрузки и присоединения дополнительных пакетов

# 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

7 голосов
/ 20 ноября 2014

Очень хороший пример использования вставки и замены для набора символов (математический график) и переменных в http://vis.supstat.com/2013/04/mathematical-annotation-in-r/

Вот адаптация 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)
3 голосов
/ 17 ноября 2015

Если x ^ 2 и y ^ 2 были выражениями, уже заданными в квадрате переменной, это решает проблему:

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)

Обратите внимание на [[1]] за квадратом [1].Содержит выражение «... (...)» в скобках без каких-либо escape-символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...