【问题标题】:Scaling the axes in a polar plot of ggplot individually?单独缩放ggplot极坐标图中的轴?
【发布时间】:2018-02-27 11:16:34
【问题描述】:

我的数据集是

cvar setting value
var1 min 20
var2 min 5
var3 min 140
var4 min 40
var5 min 600
var1 max 60
var2 max 15
var3 max 180
var4 max 80
var5 max 1200
var1 center 40
var2 center 10
var3 center 160
var4 center 60
var5 center 900
var1 upper 57
var2 upper 13
var3 upper 162
var4 upper 79
var5 upper 1250
var1 lower 20
var2 lower 6
var3 lower 153
var4 lower 40
var5 lower 620

library(ggplot2)
ggplot(data=daten, aes(x=factor(cvar), y=value, group = setting, color = setting)) + 
  geom_line() + 
  coord_polar()

我得到了一些接近我正在寻找的东西。 我想让每个轴单独缩放,从 0 到各自的最大值,或者每个轴都有单独的最小值和最大值。

有人可以给我一个提示吗? 提前致谢 霍尔格

【问题讨论】:

  • 嗯......这在ggplot中可能吗?您要问的是没有分面的多个 Y 轴。

标签: r ggplot2 polar-coordinates


【解决方案1】:

如果您的意思是要为每个 cvar 缩放值的范围,您可以在将数据框传递给 ggplot 之前执行此操作:

library(dplyr)

daten2 <- daten %>%
  group_by(cvar) %>%

  # option 1: this scales the values at each varX from 0 to max
  mutate(value.scaled = value / max(value)) %>% 

  # option 2: this scales the values at each varX from min to max
  mutate(value.scaled2 = (value - min(value)) / (max(value) - min(value))) %>%

  ungroup() %>%
  mutate(setting = factor(setting,
                          levels = c("max", "upper", "center", "lower", "min")))

p1 <- ggplot(data = daten2, 
       aes(x = factor(cvar), y = value.scaled, group = setting, color = setting)) + 
  geom_line(size = 1) + 
  expand_limits(y = 0) +
  coord_polar() +
  ggtitle("Scaled value range from 0 to max")

p2 <- ggplot(data = daten2, 
             aes(x = factor(cvar), y = value.scaled2, group = setting, color = setting)) + 
  geom_line(size = 1) + 
  coord_polar() +
  ggtitle("Scaled value range from min to max")

gridExtra::grid.arrange(p1, p2, nrow = 1)

编辑:如果要加入第一个和最后一个cvar值,可以在x轴末尾重复var1,并显式设置expand = c(0, 0),这样最后一个@ 987654332@值与极坐标下的第一个连接:

# I'm only demonstrating with one of the two cases above, 
# but the same principle applies in either case.

ggplot(data = daten2 %>%
         filter(cvar == "var1") %>% # make a copy of the dataset with only var1
         mutate(cvar = "var6") %>%
         rbind(daten2),             # append the copy to the full dataset
             aes(x = factor(cvar), y = value.scaled2, group = setting, color = setting)) + 
  geom_line(size = 1) + 
  scale_x_discrete(expand = c(0, 0),
                   breaks = c("var1", "var2", "var3", "var4", "var5")) +
  coord_polar() +
  ggtitle("Scaled value range from min to max")

如果您希望线在极坐标下笔直,答案here 描述了另一种选择:

coord_radar <- function (theta = "x", start = 0, direction = 1) {
  theta <- match.arg(theta, c("x", "y"))
  r <- if (theta == "x") "y" else "x"
  ggproto("CordRadar", CoordPolar, theta = theta, r = r, start = start, 
          direction = sign(direction),
          is_linear = function(coord) TRUE)
}

ggplot(data = daten2 %>%
         filter(cvar == "var1") %>%
         mutate(cvar = "var6") %>%
         rbind(daten2), 
             aes(x = factor(cvar), y = value.scaled2, group = setting, color = setting)) + 
  geom_line(size = 1) + 
  scale_x_discrete(expand = c(0, 0),
                   breaks = c("var1", "var2", "var3", "var4", "var5")) +
  coord_radar() +
  ggtitle("Scaled value range from min to max")

【讨论】:

  • 感谢 Z.Lin,我一直在寻找 ggplot 或其他库的内置方法,但您的回答和来自@PoGibas 的评论证实,没有预先配置的方法可以做到这一点。我现在可以抑制公共比例并用各自的最大值加上其名称标记每个轴,并关闭开始和结束之间的线(如何?)。我想将圆角曲线变成直线可以与 geom_step 一起使用吗?再次感谢,我投票赞成你的回答。
  • @HvL 已编辑我的答案。在 SO 上已经多次询问过在极坐标下直接转动圆线,但一些解决方法已经过期。我链接的解决方法仍然有效。目前。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多