将极坐标直方图与极坐标散点图结合起来

时间:2016-08-04 08:00:19

标签: r plot ggplot2 histogram

我想绘制一个图表,该图表结合了极坐标图(罗盘轴承测量值)和极坐标散点图(表示倾角和轴承值)。例如,这就是我想要生成的内容(source):

enter image description here

让我们忽略直方图尺度的绝对值无意义;我们在图中显示直方图进行比较,而不是读取确切的值(这是地质学中的传统图)。直方图y轴文本通常不会显示在这些图中。

这些点表示它们的方位(垂直角度)和倾角(距离中心的距离)。倾角始终在0到90度之间,轴承始终为0-360度。

我可以得到一些方法,但我坚持直方图的比例(在下面的例子中,0-20)和散点图的比例之间的不匹配(总是0-90,因为它是一个倾角测量)。

这是我的例子:

n <-  100
bearing <- runif(min = 0, max = 360, n = n) 
dip <- runif(min = 0, max = 90, n = n)

library(ggplot2)
ggplot() +
  geom_point(aes(bearing, 
                 dip),
             alpha = 0.4) +
  geom_histogram(aes(bearing),
                 colour = "black", 
                 fill = "grey80") +
  coord_polar() +
  theme(axis.text.x = element_text(size = 18)) +
  coord_polar(start = 90 * pi/180) +
  scale_x_continuous(limits = c(0, 360), 
                     breaks = (c(0, 90, 180, 270))) +
  theme_minimal(base_size = 14) +
  xlab("") +
  ylab("") +
  theme(axis.text.y=element_blank())

enter image description here

如果你仔细观察,你会在圆圈的中心看到一个微小的直方图。

如何让直方图看起来像顶部的图,以便直方图自动缩放,以便最高的条等于圆的半径(即90)?

2 个答案:

答案 0 :(得分:2)

这不是最终解决方案,但我认为它朝着正确的方向发展。 这里的问题是直方图的比例与点的比例完全不同。按比例我想要最大y值。

如果你重新调整积分,你可以得到这个:

scaling <- dip / 9
ggplot()  +
    geom_point(aes(bearing, 
                   scaling),
               alpha = 0.4) +
    geom_histogram(aes(bearing),
                   colour = "black", 
                   fill = "grey80") +
    coord_polar() +
    theme(axis.text.x = element_text(size = 18)) +
    coord_polar(start = 90 * pi/180) +
    scale_x_continuous(limits = c(0, 360), 
                       breaks = (c(0, 90, 180, 270))) +
    theme_minimal(base_size = 14) +
    xlab("") +
    ylab("") +
    theme(axis.text.y=element_blank())

enter image description here

在这里,我启发式地找到了缩放的数字。 下一步是找出一种定义它的算法方法。 类似于:获取点的最大y值并除以 直方图的最大y值。

答案 1 :(得分:2)

library(Hmisc) library(dplyr) set.seed(2016) n <- 100 bearing <- runif(min = 0, max = 360, n = n) dip <- runif(min = 0, max = 90, n = n) rescale_prop <- function(x, a, b, min_x = min(x), max_x = max(x)) { (b-a)*(x-min_x)/(max_x-min_x) + a } to_barplot <- bearing %>% cut2(cuts = seq(0, 360, 20)) %>% table(useNA = "no") %>% as.integer() %>% rescale_prop(0, 90, min_x = 0) %>% # min_x = 0 to keep min value > 0 (if higher than 0 of course) data.frame(x = seq(10, 350, 20), y = .) library(ggplot2) ggplot() + geom_bar(data = to_barplot, aes(x = x, y = y), colour = "black", fill = "grey80", stat = "identity") + geom_point(aes(bearing, dip), alpha = 0.4) + geom_hline(aes(yintercept = 90), colour = "red") + coord_polar() + theme(axis.text.x = element_text(size = 18)) + coord_polar(start = 90 * pi/180) + scale_x_continuous(limits = c(0, 360), breaks = (c(0, 90, 180, 270))) + theme_minimal(base_size = 14) + xlab("") + ylab("") + theme(axis.text.y=element_blank()) 可能会以更简单的方式制作,但现在是:

.then

结果:

result