【问题标题】:ggplot legend issue w/ geom_point and geom_text带有 geom_point 和 geom_text 的 ggplot 图例问题
【发布时间】:2011-05-12 09:26:05
【问题描述】:

我正在尝试使用geom_point 来说明我的数据计数。我还想用geom_text 注释我图表中的一些点。当我将调用添加到geom_text 时,它似乎正在图例中的点下方绘制一些东西。我试过颠倒图层的顺序无济于事。我无法理解它为什么这样做。有没有人见过这个?

set.seed(42)
df <- data.frame(x = 1:10
    , y = 1:10
    , label = sample(LETTERS,10, replace = TRUE)
    , count = sample(1:300, 10, replace = FALSE)
)

p <- ggplot(data = df, aes(x = x, y = y, size = count)) + geom_point()
p + geom_text(aes(label = label, size = 150, vjust = 2))

【问题讨论】:

    标签: r ggplot2 legend


    【解决方案1】:

    或者,如果你需要在aes中指定文本的大小,那么legend = FALSE禁止绘制geom的图例:

    p <- ggplot(data = df, aes(x = x, y = y, size = count)) + geom_point()
    p + geom_text(aes(label = label, size = 150, vjust = 2), show_guide = FALSE)
    

    【讨论】:

    • 啊,我从来没有想过在图层级别使用它。做得很好。
    • 只是一个小信息:“legend”已被“show_guides”取代:geom_XXX 和 stat_XXX 中的“legend”参数已弃用。使用 show_guide = TRUE 或 show_guide = FALSE 显示或禁止显示指南。"
    【解决方案2】:

    这一直发生在我身上。诀窍是知道aes() 将数据映射到美学。如果没有要映射的数据(例如,如果您确定了一个值),则没有理由使用 aes()。我相信只有aes() 中的内容才会出现在您的图例中。

    此外,当您在ggplot(aes()) 中指定映射时,这些映射将应用于每个后续层。这对您的 x 和 y 有好处,因为 geom_pointgeom_text 都使用它们。这对size = count 不利,因为这只适用于积分。

    所以这是我防止这种事情发生的两条规则:

    1. 仅将基于数据的映射放在aes() 中。如果参数采用单个预定值,请将其传递到aes()outside 层。
    2. 地图数据仅适用于那些将使用它的图层。推论:如果您确信每个后续层都会使用它,则仅在 ggplot(aes()) 内映射数据。否则,在图层级别对其进行映射。

    所以我会这样绘制:

    p <- ggplot(data = df, aes(x = x, y = y)) + geom_point(aes(size = count)) 
    p + geom_text(aes(label = label), size = 4, vjust = 2) 
    

    【讨论】:

    • 你的两条规则是相关的!
    • 了解未来的非常有用的提示,我仍在尝试使用 ggplot2 来了解最佳实践。您对将要绘制的数据对象进行子集化有什么建议吗?例如,如果您只想注释第一个和最后一个点?我一直在使用geom_text(data = df[grep("xxx", df$label) , ] , aes(x = ...)) 之类的东西。有没有更好的方法来做到这一点?
    • Chase - 这是个好问题。从中提出一个新问题可能是明智的;我有一些模糊的概念,但很可能其他人有一个具体的想法。
    • directlabels 包促进了这种自定义注释,IIRC
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    相关资源
    最近更新 更多