Объединение функций paste() и expression() в метках графика
Рассмотрим этот простой пример:
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" с индексом присоединяется к надстрочному выражению.
Любые мысли?
Ответы
Ответ 1
Альтернативным решением для @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)
(Обратите внимание, что ~
просто добавляет немного интервала, если вам не нужно пространство, замените его на *
, и две части выражения будут сопоставлены.)
Ответ 2
Используйте 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])))
Ответ 3
РЕДАКТИРОВАТЬ: добавлен новый пример для 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]()
Ответ 4
Очень хороший пример использования вставки и замены для набора как символов (mathplot), так и переменных по адресу http://vis.supstat.com/2013/04/matumatic-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)
Ответ 5
Если 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-символов.