使用 ggplot & coord_polar (Condegram) 的螺旋条形图
Spiral barplot using ggplot & coord_polar (Condegram)
我想在阿基米德螺线上创建一个条形图,就像 here 所讨论的那样。
最终目标类似于 this,但不那么压倒性。
这是一个示例数据框:
test <- structure(list(month = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12),
year = c(2015, 2015, 2015, 2015, 2015, 2015, 2015,
2015, 2015, 2015, 2015, 2015, 2016, 2016,
2016, 2016, 2016, 2016, 2016, 2016, 2016,
2016, 2016, 2016),
value = c(49, 34, 35, 34, 50, 35, 48, 50, 44, 38, 42,
43, 33,30, 42, 43, 58, 55, 47, 36, 35, 53,
61, 59)),
.Names = c("month", "year", "value"),
class = "data.frame", row.names = c(NA, -24L))
我可以使用以下代码制作条形图:
ggplot(monthly, aes(x = ym, y = value)) +
geom_bar(stat = "identity")
我可以使用以下代码制作螺旋:
a <- 0 #Any number here & it still looks the same to me...
b <- 10 #Any number here & it still looks the same to me...
theta <- seq(0,10*pi, 0.01)
r <- a + b*theta
df <- data.frame(x = r*cos(theta), y = r*sin(theta))
ggplot(df, aes(x,y)) +
geom_point(col = 'red')
但是我如何(如果有的话)在螺旋上绘制条形图?
这和我得到的差不多:用 my 数据而不是上面的公式创建螺旋。但是我的数据实际上并没有显示...
d <- ggplot(monthly, aes(x = month, y = month, color = year)) +
geom_path(size = 2) +
coord_polar() +
theme_minimal() +
theme(legend.position = "none")
d
一个有趣的问题。要使用条形图正确执行此操作,我们需要使用多边形来正确说明每个角的 'warp'。您拥有的每个周期的条形越多,该图看起来会越好,但您可以更改 y 限制以避免中心出现强烈失真。您必须想出一些方法来很好地标记 y-axis,但 coord_polar
一开始并不是很擅长。
library(tidyverse)
首先,要么从头开始创建示例 df:
monthly <-
expand.grid(month = 1:12, year = factor(unique(monthly$year))) %>%
mutate(value = runif(n(), 10, 20),
y = as.numeric(year) - 1 + (month - 1) / 12)
或者,从现有的 df 工作:
monthly <- monthly %>%
mutate(y = as.numeric(year) - 1 + (month - 1) / 12)
继续以下内容:
bars <- monthly %>%
mutate(value_norm = value / (max(value) * 1.1),
xmin = month - 0.5,
xmax = month + 0.5,
ymin = y,
ymax = y + value_norm)
# we could plot `bars` here, but things will not line up nicely, since
# the bar will be nice and flat, but it needs to curve with the spiral.
poly <- bars %>%
rowwise() %>%
do(with(., data_frame(year = year,
month = month,
x = c(xmin, xmax, xmax, xmin),
y = c(ymin - 1/24,
ymin + 1/24,
ymax + 1/24,
ymax - 1/24))))
ggplot(poly, aes(x, y, fill = interaction(month, year))) +
geom_polygon(col = 1) +
coord_polar() +
ylim(-3, 5) +
viridis::scale_fill_viridis(discrete = TRUE, option = 'C') +
scale_x_continuous(breaks = 1:12, labels = month.name) +
theme_minimal() +
theme(legend.position = "none", axis.text.y = element_blank(),
axis.title = element_blank())
另一种方法是制作一个螺旋式热图:
bars2 <- monthly %>%
mutate(xmin = month - 0.5,
xmax = month + 0.5,
ymin = y,
ymax = y + 1)
poly2 <- bars2 %>%
rowwise() %>%
do(with(., data_frame(value = value,
year = year,
month = month,
x = c(xmin, xmax, xmax, xmin),
y = c(ymin - 1/24, ymin + 1/24, ymax + 1/24, ymax - 1/24))))
我想在阿基米德螺线上创建一个条形图,就像 here 所讨论的那样。
最终目标类似于 this,但不那么压倒性。
这是一个示例数据框:
test <- structure(list(month = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12),
year = c(2015, 2015, 2015, 2015, 2015, 2015, 2015,
2015, 2015, 2015, 2015, 2015, 2016, 2016,
2016, 2016, 2016, 2016, 2016, 2016, 2016,
2016, 2016, 2016),
value = c(49, 34, 35, 34, 50, 35, 48, 50, 44, 38, 42,
43, 33,30, 42, 43, 58, 55, 47, 36, 35, 53,
61, 59)),
.Names = c("month", "year", "value"),
class = "data.frame", row.names = c(NA, -24L))
我可以使用以下代码制作条形图:
ggplot(monthly, aes(x = ym, y = value)) +
geom_bar(stat = "identity")
我可以使用以下代码制作螺旋:
a <- 0 #Any number here & it still looks the same to me...
b <- 10 #Any number here & it still looks the same to me...
theta <- seq(0,10*pi, 0.01)
r <- a + b*theta
df <- data.frame(x = r*cos(theta), y = r*sin(theta))
ggplot(df, aes(x,y)) +
geom_point(col = 'red')
但是我如何(如果有的话)在螺旋上绘制条形图?
这和我得到的差不多:用 my 数据而不是上面的公式创建螺旋。但是我的数据实际上并没有显示...
d <- ggplot(monthly, aes(x = month, y = month, color = year)) +
geom_path(size = 2) +
coord_polar() +
theme_minimal() +
theme(legend.position = "none")
d
一个有趣的问题。要使用条形图正确执行此操作,我们需要使用多边形来正确说明每个角的 'warp'。您拥有的每个周期的条形越多,该图看起来会越好,但您可以更改 y 限制以避免中心出现强烈失真。您必须想出一些方法来很好地标记 y-axis,但 coord_polar
一开始并不是很擅长。
library(tidyverse)
首先,要么从头开始创建示例 df:
monthly <-
expand.grid(month = 1:12, year = factor(unique(monthly$year))) %>%
mutate(value = runif(n(), 10, 20),
y = as.numeric(year) - 1 + (month - 1) / 12)
或者,从现有的 df 工作:
monthly <- monthly %>%
mutate(y = as.numeric(year) - 1 + (month - 1) / 12)
继续以下内容:
bars <- monthly %>%
mutate(value_norm = value / (max(value) * 1.1),
xmin = month - 0.5,
xmax = month + 0.5,
ymin = y,
ymax = y + value_norm)
# we could plot `bars` here, but things will not line up nicely, since
# the bar will be nice and flat, but it needs to curve with the spiral.
poly <- bars %>%
rowwise() %>%
do(with(., data_frame(year = year,
month = month,
x = c(xmin, xmax, xmax, xmin),
y = c(ymin - 1/24,
ymin + 1/24,
ymax + 1/24,
ymax - 1/24))))
ggplot(poly, aes(x, y, fill = interaction(month, year))) +
geom_polygon(col = 1) +
coord_polar() +
ylim(-3, 5) +
viridis::scale_fill_viridis(discrete = TRUE, option = 'C') +
scale_x_continuous(breaks = 1:12, labels = month.name) +
theme_minimal() +
theme(legend.position = "none", axis.text.y = element_blank(),
axis.title = element_blank())
另一种方法是制作一个螺旋式热图:
bars2 <- monthly %>%
mutate(xmin = month - 0.5,
xmax = month + 0.5,
ymin = y,
ymax = y + 1)
poly2 <- bars2 %>%
rowwise() %>%
do(with(., data_frame(value = value,
year = year,
month = month,
x = c(xmin, xmax, xmax, xmin),
y = c(ymin - 1/24, ymin + 1/24, ymax + 1/24, ymax - 1/24))))