我正在试着做我认为会是一件容易的事情,但我被困住了.

我只想以百分比的形式显示密度图,但ggplot2::scale_y_continuous()似乎不是我所期望的方式…

此外,我想调整图例,改变列数和关键形状与ggplot2::guide_legend()...后者不起作用(但它确实适用于ggplot2::geom_point()).

我做错了什么?

这是我的MWE和iris个数据(抱歉,可能有一些额外的信息,但我尽可能地将其保存在我的真实世界代码中):

data(iris)
iris$ID <- paste("sample", rownames(iris))
selected_marker <- "Sepal.Length"
group_for_color <- "Species"
X <- iris[,selected_marker]
plot_data <- data.frame(X, Group=iris[, group_for_color],
                        ID=iris$ID, stringsAsFactors=FALSE)
names(plot_data)[1] <- selected_marker
plot_data$Group <- factor(plot_data$Group, levels=gtools::mixedsort(unique(plot_data$Group)))
plot_palette <- c("#E41A1C", "#377EB8", "#4DAF4A")
legend_cols <- 1
stroke <- 1
size <- 20
bottom <- 0
top <- 100
breaks <- seq(0, 100, 10)
P <- ggplot2::ggplot(plot_data, ggplot2::aes(x=!!ggplot2::sym(selected_marker), color=Group, fill=Group)) +
  ggplot2::geom_density(alpha=0.25, linewidth=stroke) +
  ggplot2::ggtitle(selected_marker) +
  ggplot2::scale_fill_manual(group_for_color, values=plot_palette, drop=FALSE, guide="none") +
  ggplot2::scale_color_manual(group_for_color, values=plot_palette, drop=FALSE,
                              guide=ggplot2::guide_legend(ncol=legend_cols,
                                                          override.aes=list(shape=19, size=size))) +
  ggplot2::scale_y_continuous("percent", labels=scales::percent, limits=c(bottom, top), breaks=breaks) +
  ggplot2::theme_light() +
  ggplot2::theme(plot.title = ggplot2::element_text(face="bold",size=size),
                 axis.text=ggplot2::element_text(size=size),
                 axis.title=ggplot2::element_text(size=size,face="bold"),
                 legend.text=ggplot2::element_text(size=size),
                 legend.title=ggplot2::element_text(size=size,face="bold"),
                 legend.position="bottom",
                 legend.key.size=grid::unit(0.5,"inch"),
                 plot.margin = grid::unit(c(1,1,1,1), "lines"))
grDevices::pdf(file="test.pdf", height=10, width=10)
print(P)
grDevices::dev.off()

这给我带来了这样的情节:

test

请注意,百分比不是从0到19%,因此分布都被挤压,关键字形状没有更改为19(实心圆圈).

你知道如何解决这些问题吗?我认为这将是相当简单的.谢谢!

推荐答案

替换这些:

top <- 1  # since 1 = 100%
breaks <- seq(0, 1, 0.1)

...
ggplot2::geom_density(alpha=0.25, linewidth=stroke, key_glyph = draw_key_point) +
# remove the limits from scale_y_continuous lest data be excluded for areas >100%. 
# better to use `coord_continuous(ylim = c(0,1))` if you want to control the viewport
ggplot2::scale_y_continuous("percent", labels=scales::percent, breaks=breaks) +
...

(请记住,如果数据在峰值点的宽度小于1个单位,则密度图不需要垂直限制在100%以下.密度曲线下的面积(x距离乘以y高度)将等于1,但这并不意味着峰值必须为100%.)

enter image description here

R相关问答推荐

将一个载体的值相加,直到达到另一个载体的值

从多个前置日期中获取最长日期

使用ggplot将平滑线添加到条形图

如何对数据集进行逆向工程?

大规模重新标记haven标签数据

矩阵%*%矩阵中的错误:需要数字/复杂矩阵/向量参数

多重RHS固定估计

如果行和大于值,则过滤

如何调整曲线图中的y轴标签?

将. xlsx内容显示为HTML表

基于R中的间隔扩展数据集行

调换行/列并将第一行(原始数据帧的第一列)提升为标题的Tidyr类似功能?

如何计算增加10米(0.01公里)的行?

有没有办法定制Plot(allEffects())面板标题?

R -基线图-图形周围的阴影区域

是否有可能从边界中找到一个点值?

将文本批注减少到gglot的y轴上的单个值

名字的模糊匹配

R:使用ApexCharge更改标签在饼图中的位置

通过不完全重叠的多个柱连接