在ggplot中围绕候选点绘制半径0.1的圆形是否可行
解决方案
当然可以实现,你可以借助ggforce包中的geom_circle()函数来绘制指定半径的圆周,步骤如下:
- 首先安装并加载
ggforce包(如果尚未安装):
install.packages("ggforce") library(ggforce)
- 在你的现有绘图代码中添加
geom_circle()图层,针对candidates数据框中的两个候选点绘制圆周:
修改后的完整绘图代码如下:
ggplot(df, aes(lambda, log_likelihood)) + geom_line() + geom_point(aes(x = lambda_mle, y = log_likelihood[which.min(abs(lambda_values - lambda_mle))], color = "Estimated Value"), size = 3) + geom_point(aes(x = 5, y = log_likelihood[which.min(abs(lambda_values - 5))], color = "True Value"), size = 3) + geom_point(data = candidates, aes(x = lambda, y = log_likelihood, color = candidate), size = 3) + # 添加候选点的圆周 geom_circle(data = candidates, aes(x0 = lambda, y0 = log_likelihood, r = 0.1, color = candidate), linetype = "solid", # 可改为"dashed"使用虚线 fill = NA) + # 设为NA表示只画圆周,不填充内部 labs(x = "Lambda", y = "Log-Likelihood", title = "Log-Likelihood Function for Poisson Distribution") + theme_minimal() + scale_color_manual(values = c("True Value" = "green", "Estimated Value" = "red", "Candidate Solution #1" = "purple", "Candidate Solution #2" = "orange")) + geom_text(aes(lambda_mle, log_likelihood[which.min(abs(lambda_values - lambda_mle))], label = round(lambda_mle, 2), color = "Estimated Value"), hjust = -0.2, vjust = -1.5) + geom_text(aes(5, log_likelihood[which.min(abs(lambda_values - 5))], label = 5, color = "True Value"), hjust = -0.2, vjust = 1.5) + geom_text(data = candidates, aes(x = lambda, y = log_likelihood, label = lambda, color = candidate), hjust = 0.5, vjust = -1) + xlim(5, 5.5) + labs(color = "Legend")
关键说明:
geom_circle()的x0和y0参数对应圆心坐标(即候选点的lambda和对数似然值),r参数设置半径为0.1;fill = NA确保只绘制圆周轮廓,不会填充内部区域;linetype参数可根据需求设置为solid(实线)或dashed(虚线);- 颜色映射沿用了原有的候选点颜色,保证圆周和对应点颜色一致。
如果不想额外安装包,也可以用annotate()手动添加两个圆周,但这种方式需要逐个指定坐标,不如用geom_circle()结合数据框灵活:
# 手动添加圆周的示例(无需ggforce) annotate("circle", xmin = 5.1 - 0.1, xmax = 5.1 + 0.1, ymin = candidates$log_likelihood[1] - 0.1, ymax = candidates$log_likelihood[1] + 0.1, color = "purple", fill = NA) + annotate("circle", xmin = 5.2 - 0.1, xmax = 5.2 + 0.1, ymin = candidates$log_likelihood[2] - 0.1, ymax = candidates$log_likelihood[2] + 0.1, color = "orange", fill = NA)
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

