【问题标题】:circle graph showing bearings and distance显示方位和距离的圆图
【发布时间】:2019-01-11 15:35:33
【问题描述】:

我试图显示个人离开站点的方位和 1 天内行进的距离,以及以不同方位旅行的人数。

目前,我可以在 ggplot2 中制作这些基本图:

# distance & bearing
ggplot(data=df,
       aes(bear, dist)) +
  geom_point() +
  scale_y_log10()

# no. individuals & bearing
ggplot(data=df.postDepDT,
       aes(bear)) +
  geom_histogram(bins = 36)

#my data looks like the following
bear <- c(-172, -175, -160, -155, -150, -10, 23, 87, 122, 179)
dist <- c(5, 101, 326, 47, 23, 55, 6, 7, 44, 162)
df <- data.frame(bear, dist)

我希望我的最终情节有两个面板。第一个是一个圆,具有不同长度(表示距离)的点,沿轴承方向从圆向外辐射。这些点将连接到沿轴承的圆。第二个是圆圈周围的直方图,显示沿每个方位远离圆圈的个人数量。

在这些图中,0o(或北)将位于顶部,-180o/180o(南)将位于底部,左右分别为 -90o 和 90o(西和东)。

更新:

将 coord_polar() 添加到图形有助于制作圆形图形,但是,我仍然无法在图形顶部获得 0o 值(对于北)(start=0 将 0o 值放在底部) .另外,我仍在寻找将第一个图中的点连接到中心点的解决方案。

【问题讨论】:

  • 那么您的问题到底是什么?你在哪里卡住了?
  • @MrFlick 我需要一种方法来包裹 x 轴,以便图形在圆形而不是平面上。
  • ?coord_polar 是您所需要的。
  • 谢谢@Axeman。这很有帮助,但是 0 值落在两个图的南端,而不是顶部(0 = N 代表我的方位)。你知道如何解决这个问题吗?另外,您知道如何将绘图的中心连接到第一个绘图中的点吗?
  • 你读过?coord_polar吗?有一个start 参数可以设置任意开始(“北”)值。您可以使用geom_segment 为您的第二个问题绘制任意线,或查找“棒棒糖图”。

标签: r ggplot2 plot


【解决方案1】:

你在寻找这样的东西吗?

ggplot(data=df,
       aes(bear, dist)) +
  geom_segment(aes(xend = bear, yend = 0.1)) +
  geom_point() +
  scale_x_continuous(limits = c(-180, 180),
                     breaks =  seq(-180, 180, 90)) +
  # scale_y_log10() +
  coord_polar(start = pi) +
  theme_bw()

解释

  1. geom_segment() 期望 xyxendyend 的美学。 “pre-coord_polar”版本的圆形图表,线条从中心向外辐射,是笛卡尔坐标中的图表,线条垂直下降以与 x 轴相交,因此我们希望每个 xend 值与x 值相同,每个yend 值尽可能小(距离为0,但由于您对y 轴的对数刻度感兴趣,我添加了一个小的正值):

ggplot(data=df,
       aes(bear, dist)) +
  geom_segment(aes(xend = bear, yend = 0.1)) +
  geom_point() +
  scale_x_continuous(limits = c(-180, 180),
                     breaks =  seq(-180, 180, 90)) +
  # scale_y_log10() +
  # coord_polar(start = pi) +
  theme_bw()
  1. coord_polar()start 参数需要以下内容(已添加重点):

弧度

从 12 点开始的偏移量

由于您的轴承实际值在c(-175, 179) 范围内,我希望您的比例为c(-180, 180)。默认的start = 0 将因此将-180/180 放置在12 点钟的位置。要将 0 放置在 12 点钟位置,请设置 start = pi,即 180 度的弧度。

  1. 最后,我敦促您仔细考虑为什么要使用对数刻度来表示距离。在技​​术层面上,为yend 选择任意小的正值可能会导致同一点看起来与中心的距离不同。 (有关 yend 的一些值,请参见下图)在更理论的层面上,我认为当我们比较大范围的数量时,对数刻度是合适的,但这里的情况并非如此。

p <- ggplot(data=df,
       aes(bear, dist)) +
  geom_point() +
  scale_x_continuous(limits = c(-180, 180),
                     breaks =  seq(-180, 180, 90)) +
  scale_y_log10() +
  coord_polar(start = pi) +
  theme_bw()

gridExtra::grid.arrange(
  p + geom_segment(aes(xend = bear, yend = 1)) + ggtitle("yend = 1"),
  p + geom_segment(aes(xend = bear, yend = 0.1)) + ggtitle("yend = 0.1"),
  p + geom_segment(aes(xend = bear, yend = 0.01)) + ggtitle("yend = 0.01"),
  p + geom_segment(aes(xend = bear, yend = 0.001)) + ggtitle("yend = 0.001"),
  nrow = 2
)

【讨论】:

  • 感谢您对我发布的任何问题的最全面的解释。我真的很感谢详细的解释,以及关于我选择的适当性的有用的 cmets。关于对数比例的一个快速评论,因为我的实际数据集跨越 3 个数量级,我可能不得不使用对数比例,但我会考虑你在上面提出的观点,并确保我选择的值是 yend,最大限度地减少失真的数据。再次感谢您!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 2015-02-17
  • 2021-01-09
  • 2020-11-27
  • 2011-02-18
  • 2014-05-23
相关资源
最近更新 更多