У меня есть следующий набор данных.Сделайте функцию, которая рисует график и сохранит его
structure(list(Rf = c(60.105, 62.205, 64.305, 64.305, 66.405,
66.405), Es = c(0, -0.07, -0.36, -0.47, -0.39, -1.54), H = c(32.3,
-6.9, -5.59, -14.4, -6.5, -21), S = c(267, 136, 151, 114, 143,
90.4), G = c(-46.8, -47.3, -50.7, -48.5, -49, -47.8)), .Names = c("Rf",
"Es", "H", "S", "G"), class = "data.frame", row.names = c("Me",
"Et", "Pr", "iPr", "Bu", "tBu"))
Мне нужно построить Rf vs H, S и G, и то же самое для столбца Es. Всего шесть участков.
Чтобы нарисовать одного участка я использую следующую функцию:
ggplot(data=df, aes(x=Rf, y=H, label=row.names(df))) +
geom_point(size=4) +
geom_text(vjust=2) +
ylab(expression(list(Delta*H^o,~kJ/mol))) +
xlab("Molecular refraction") +
ylim((min(df$H) - 0.2*(abs(min(df$H)))), max(df$H)) +
opts(axis.line = theme_segment(size=1),
axis.text.x = theme_text(colour="black", size=15),
axis.text.y = theme_text(colour="black", size=15),
axis.title.x = theme_text(colour="black", size=15),
axis.title.y = theme_text(colour="black", size=15, angle=90),
panel.background=theme_rect(colour="white"),
panel.grid.minor = theme_blank(),
panel.grid.major = theme_blank())
Я хочу создать функцию, как
f1 <- function(x.label, y.label, df, xtitle, filename) {
g <- ggplot(data=df, aes(x=x.label, y=y.label, label=row.names(df))) +
geom_point(size=4) +
geom_text(vjust=2) +
ylab(expression(list(Delta*y.label^o,~kJ/mol))) +
xlab(xtitle) +
ylim((min(df[,y.label]) - 0.2*(abs(min(df[,y.label])))), max(df[,y.label])) +
opts(axis.line = theme_segment(size=1),
axis.text.x = theme_text(colour="black", size=15),
axis.text.y = theme_text(colour="black", size=15),
axis.title.x = theme_text(colour="black", size=15),
axis.title.y = theme_text(colour="black", size=15, angle=90),
panel.background=theme_rect(colour="white"),
panel.grid.minor = theme_blank(),
panel.grid.major = theme_blank())
ggsave(filename, g)
}
Для вызова на приведенном выше примере, как
f1(Rf, H, df, "Molecular refraction", "D:/temp/1.jpg")
Сложность заключается в том, как передавать и правильно обрабатывать x.label
и y.label
, так как они используются в aes
опцией ggplot
, ylab(expression())
и ylim
звонков. Curent функция возвращает ошибку Error in eval(expr, envir, enclos) : object 'x.label' not found
ОТВЕТ:
Следующая функция работает правильно. aes_string
следует использовать в качестве источника aes
в варианте ggplot
и substitute
вместо expression
в ylab
.
f1 <- function(x.label, y.label, df, x.title, filename) {
g <- ggplot(data=df, aes_string(x=x.label, y=y.label)) +
geom_point(size=4) +
geom_text(aes(label=row.names(df)), vjust=2) +
ylab(substitute(list(Delta*y.label^o,~kJ/mol), list(y.label=y.label))) +
xlab(x.title) +
ylim((min(df[,y.label]) - 0.2*(abs(min(df[,y.label])))), max(df[,y.label])) +
opts(axis.line = theme_segment(size=1),
axis.text.x = theme_text(colour="black", size=15),
axis.text.y = theme_text(colour="black", size=15),
axis.title.x = theme_text(colour="black", size=15),
axis.title.y = theme_text(colour="black", size=15, angle=90),
panel.background = theme_rect(colour="white"),
panel.grid.minor = theme_blank(),
panel.grid.major = theme_blank())
ggsave(filename=filename, plot=g)
}
'aes_string' должен работать, но когда я меняю' aes' на 'aes_string', кажется, что опция' label' не работает должным образом, потому что функция возвращает ошибку: 'eval (expr, envir, enclos): object ' Меня не найдено. Спасибо за предложение использовать функции 'eval' и' parse', я попытаюсь их использовать. – DrDom