【发布时间】:2021-11-23 23:47:06
【问题描述】:
我想在 Julia 中绘制一个复杂的图表。下面的代码是使用 ggplot 的 Julia 版本。
using CairoMakie, DataFrames, Effects, GLM, StatsModels, StableRNGs, RCall
@rlibrary ggplot2
rng = StableRNG(42)
growthdata = DataFrame(; age=[13:20; 13:20],
sex=repeat(["male", "female"], inner=8),
weight=[range(100, 155; length=8); range(100, 125; length=8)] .+ randn(rng, 16))
mod_uncentered = lm(@formula(weight ~ 1 + sex * age), growthdata)
refgrid = copy(growthdata)
filter!(refgrid) do row
return mod(row.age, 2) == (row.sex == "male")
end
effects!(refgrid, mod_uncentered)
refgrid[!, :lower] = @. refgrid.weight - 1.96 * refgrid.err
refgrid[!, :upper] = @. refgrid.weight + 1.96 * refgrid.err
df= refgrid
ggplot(df, aes(x=:age, y=:weight, group = :sex, shape= :sex, linetype=:sex)) +
geom_point(position=position_dodge(width=0.15)) +
geom_ribbon(aes(ymin=:lower, ymax=:upper), fill="gray", alpha=0.5)+
geom_line(position=position_dodge(width=0.15)) +
ylab("Weight")+ xlab("Age")+
theme_classic()
但是,我想再修改一下这个图表。例如,我想更改 y 轴的比例、功能区的颜色、添加一些误差线,以及更改图例的文本大小等等。由于我是 Julia 新手,因此我没有成功找到这些修改的等效语言代码。有人可以帮我将 ggplot 下面的 R 代码翻译成 Julia 的语言吗?
t1= filter(df, sex=="male") %>% slice_max(df$weight)
ggplot(df, aes(age, weight, group = sex, shape= sex, linetype=sex,fill=sex, colour=sex)) +
geom_line(position=position_dodge(width=0.15)) +
geom_point(position=position_dodge(width=0.15)) +
geom_errorbar(aes(ymin = lower, ymax = upper),width = 0.1,
linetype = "solid",position=position_dodge(width=0.15))+
geom_ribbon(aes(ymin = lower, ymax = upper, fill = sex, colour = sex), alpha = 0.2) +
geom_text(data = t1, aes(age, weight, label = round(weight, 1)), hjust = -0.25, size=7,show_guide = FALSE) +
scale_y_continuous(limits = c(70, 150), breaks = seq(80, 140, by = 20))+
theme_classic()+
scale_colour_manual(values = c("orange", "blue")) +
guides(color = guide_legend(override.aes = list(linetype = c('dotted', 'dashed'))),
linetype = "none")+
xlab("Age")+ ylab("Average marginal effects") + ggtitle("Title") +
theme(
axis.title.y = element_text(color="Black", size=28, face="bold", hjust = 0.9),
axis.text.y = element_text(face="bold", color="black", size=16),
plot.title = element_text(hjust = 0.5, color="Black", size=28, face="bold"),
legend.title = element_text(color = "Black", size = 13),
legend.text = element_text(color = "Black", size = 16),
legend.position="bottom",
axis.text.x = element_text(face="bold", color="black", size=11),
strip.text = element_text(face= "bold", size=15)
)
【问题讨论】:
-
你读过情节documentation/tutorials 吗?您可以开始编写您的情节,然后您可以在这里搜索或询问您遇到的具体问题..
-
AlgebraOfGraphics 是 Julia 中类似 ggplot 的声明式绘图 API。 Plots.jl 是一个类似于 matplotlib 的命令式 API。
-
@Antonello,是的,我查看了 Julia 中的一些绘图包。但我暂时还是想使用
ggplot,因为我认为它更灵活、更高效 -
AlgebraOfGraphics 试图到达那里,但作为一个真正的 ggplot 粉丝,它还不能满足我(并且确实缺乏 R 的非标准评估)。所以现在,我导出结果并在 R 中进行绘图。(不过,AoG 已经很酷了!)
-
某些功能没有在 Julia 中记录的一个原因是因为它们不太适用(在某些情况下令人惊讶)。例如,测量包允许我使用 59.8 ± 5.0 之类的值。然后,当我绘制这些值时,我会在图中得到误差线,而我没有任何明确的行动。这在 Plots 文档中不会显示为整个部分,因为它是一个紧急属性。 Plots 包真的不知道这一点,因此无法记录它。在 ggplots 中,他们必须记录所有这些事情,因为没有协同作用。