【问题标题】:How do I connect the endpoint & startpoint of geom_line in a polar plot (coord_polar)?如何在极坐标图(coord_polar)中连接 geom_line 的端点和起点?
【发布时间】:2015-01-08 13:42:06
【问题描述】:

我在极坐标图中将一条线的端点与起点连接起来有点困难。

我的数据:

df <- structure(list(ri = c(0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 260, 270, 280, 290, 300, 310, 320, 330, 340, 350, 360),
                 n = c(329L, 315L, 399L, 700L, 919L, 757L, 656L, 918L, 1117L, 976L, 878L, 803L, 811L, 1072L, 1455L, 1642L, 1891L, 1688L, 1553L, 1841L, 2061L, 2321L, 2498L, 2080L, 1595L, 1080L, 1002L, 953L, 729L, 604L, 538L, 489L, 535L, 455L, 328L, 351L, 329L),
                 d = c(0.008581340149717, 0.00821617673909074, 0.0104071572028483, 0.0182581705313128, 0.0239703695975378, 0.0197449072745768, 0.017110514097916, 0.0239442864967787, 0.0291348235478234, 0.0254571063408018, 0.022900962466418, 0.0209447299094916, 0.0211533947155638, 0.0279610840136675, 0.0379509116043715, 0.0428284514463079, 0.0493231435353035, 0.0440282740812228, 0.0405070554787553, 0.0480189884973526, 0.0537572706643366, 0.0605388768616813, 0.0651555856960275, 0.0542528495787579, 0.0416025457106341, 0.0281697488197397, 0.0261352669605363, 0.0248571950233444, 0.0190145804533243, 0.015754192858447, 0.0140327082083518, 0.0127546362711599, 0.0139544589060748, 0.0118678108453533, 0.00855525704895798, 0.0091551683664154, 0.008581340149717)),
            .Names = c("ri", "n", "d"), row.names = c(NA, 37L), class = c("tbl_df", "tbl", "data.frame"))

我第一次尝试用这段代码绘制极坐标图:

ggplot(df, aes(x=ri, y=d)) +
  geom_line() +
  scale_x_continuous(breaks=seq(0,360,10)) +
  coord_polar() +
  theme_bw() +
  theme(panel.grid.minor=element_blank())

这或多或少会产生我想要的东西。但是,我喜欢从0 开始的 y 轴。 因此,我使用了以下代码:

ggplot(df, aes(x=ri, y=d)) +
  geom_line() +
  scale_x_continuous(breaks=seq(0,360,10)) +
  scale_y_continuous(limits=c(0,0.07), breaks=seq(0,0.06,0.01)) +
  coord_polar() +
  theme_bw() +
  theme(panel.grid.minor=element_blank())

不幸的是,现在该行以350 结束,并且没有与0/360 连接:

接下来我尝试了:

ggplot(df, aes(x=ri, y=d)) +
  geom_polygon(fill=NA, color="black") +
  scale_x_continuous(breaks=seq(0,360,10)) +
  scale_y_continuous(limits=c(0,0.07), breaks=seq(0,0.06,0.01)) +
  coord_polar() +
  theme_bw() +
  theme(panel.grid.minor=element_blank())

此代码确实将端点与起点连接起来,但也创建了一个圆圈:

我也尝试了geom_path,但结果与geom_polygon 相同。进一步分析问题,我尝试制作一个正常的情节:

ggplot(df, aes(x=ri, y=d)) +
  geom_line() +
  scale_x_continuous(expand=c(0,0), breaks=seq(0,360,10)) +
  scale_y_continuous(limits=c(0,0.07), breaks=seq(0,0.06,0.01)) +
  theme_bw() +
  theme(panel.grid.minor=element_blank())

给出:

如您所见,350360 之间有一条线。对geom_plygon 做同样的事情:

ggplot(df, aes(x=ri, y=d)) +
  geom_polygon(fill=NA, color="black") +
  scale_x_continuous(expand=c(0,0), breaks=seq(0,360,10)) +
  scale_y_continuous(limits=c(0,0.07), breaks=seq(0,0.06,0.01)) +
  theme_bw() +
  theme(panel.grid.minor=element_blank())

导致:

同样,使用geom_path 代替geom_polygon 会得到相同的结果。因此,问题似乎是由于结合coord_polar 设置 y 轴的限制。

我的问题:

  1. 在将geom_linecoord_polar 结合使用时,如何将极坐标图中的端点和起点与从0 开始的y 轴连接起来?
  2. 或者在将geom_polygon/geom_pathcoord_polar 结合使用时中间没有圆圈?

注意:
原始数据集没有ri=0 的行。我自己添加了这一行。这是ri=360 行的重复。

【问题讨论】:

    标签: r ggplot2 geometry line-plot


    【解决方案1】:

    经过一些尝试和错误,我通过以下步骤得到了我想要的:

    1. 使用df &lt;- df[df$ri!=360,] 删除ri=360(与ri=0 重复)的行

    2. ri 转换为因子并将group=1 添加到aes

    3. start=-pi*1/36 添加到coord_polar 以便在极坐标图的顶部获得0

    这会产生以下ggplot 代码:

    ggplot(df, aes(x=factor(ri), y=d, group=1)) +
      geom_polygon(fill=NA, color="black") +
      scale_y_continuous(limits=c(0,0.07), breaks=seq(0,0.06,0.01)) +
      coord_polar(start=-pi*1/36) +
      theme_bw() +
      theme(panel.grid.minor=element_blank())
    

    结果图:

    【讨论】:

    • @Gregor 问题中的dput 有错误,我已更正。我还在回答中更好地解释了我的解决方案。我希望现在一切都清楚了。如果它仍然不适合您,您能否在评论中发布您的代码?
    【解决方案2】:

    这是您如何设置 y 刻度范围的副作用。使用:

    ggplot(dat, aes(x=ri, y=d)) +
      geom_line() +
      scale_x_continuous(expand=c(0,0), breaks=seq(0,360,10)) +
      scale_y_continuous(breaks=seq(0,0.06,0.01)) +
      coord_polar() +
      theme_bw() +
      theme(panel.grid.minor=element_blank())
    

    这很奇怪,因为值 > 0 不应该被ylim(0, 0.07) 截断,但它确实存在......

    【讨论】:

    • 感谢您的回答。不幸的是,这不是我想要的。我没有在我的问题中包含这个,但这实际上是我的第一次尝试。但是,我喜欢从0 开始的 y 轴。我会更新我的问题来说明这一点。
    • 查看我自己的答案以获得解决此问题的方法。
    猜你喜欢
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多