将文本标签添加到 ggplot2 马赛克图
Add text labels to a ggplot2 mosaic plot
使用以下数据:
Category <- c("Bankpass", "Bankpass", "Bankpass", "Moving", "Moving")
Subcategory <- c("Stolen", "Lost", "Login", "Address", "New contract")
Weight <- c(10,20,13,40,20)
Duration <- as.character(c(0.2,0.4,0.5,0.44,0.66))
Silence <- as.character(c(0.1,0.3,0.25,0.74,0.26))
df <- data.frame(Category, Subcategory, Weight, Duration, Silence)
我用它来创建以下马赛克图:
library (ggplot2)
library (ggmosaic)
g <- ggplot(data = df) +
geom_mosaic(aes(weight = Weight, x = product(Category), fill = Duration),
offset = 0, na.rm = TRUE) +
theme(axis.text.x = element_text(angle = -25, hjust = .1)) +
theme(axis.title.x = element_blank()) +
scale_fill_manual(values = c("#e8f5e9", "#c8e6c9", "#a5d6a7", "#81c784", "#66bb6a"))
这可行,但我想在图表的元素上包含文本标签("Showing fe stolen, lost" 等)
然而,当我这样做时:
g + geom_text(x = Category, y = Subcategory, label = Weight)
我收到以下错误:
Error in UseMethod("rescale") : no applicable method for 'rescale' applied to an object of class "character"
想知道这里出了什么问题吗?
我想你正在寻找这样的东西
library(ggplot2)
library(ggmosaic)
您的数据:
Category <- c("Bankpass", "Bankpass", "Bankpass", "Moving", "Moving")
Subcategory <- c("Stolen", "Lost", "Login", "Address", "New contract")
Weight <- c(10,20,13,40,20)
Duration <- as.character(c(0.2,0.4,0.5,0.44,0.66))
Silence <- as.character(c(0.1,0.3,0.25,0.74,0.26))
mydf <- data.frame(Category, Subcategory, Weight, Duration, Silence)
ggplot(data = mydf) +
geom_mosaic(aes( x = product(Duration, Subcategory), fill=factor(Duration)), na.rm=TRUE) +
theme(axis.text.x=element_text(angle=-25, hjust= .1)) +
labs(x="Subcategory", title='f(Duration, Subcategory | Category)') +
facet_grid(Category~.) +
guides(fill=guide_legend(title = "Duration", reverse = TRUE))
输出为:
这几乎是您在 ggmosaic
包上所能做的最好的了。您应该尝试其他软件包。
祝你的项目工作顺利 ;-)
这是我的尝试。 x 轴位于离散变量(即类别)中。所以你不能在 geom_text()
中使用它。您不知何故需要为轴创建一个数字变量。同样,您需要找到标签在 y 轴上的位置。为了获得两个维度的数值,我决定访问图形后面的数据框。当您使用 ggmosaic
包时,在这种情况下,图形后面有一个数据框。您可以使用 ggplot_build()
获取它。您可以使用数据框中的信息(例如 xmin 和 xmax)计算 x 和 y 值。这是个好消息。但是,我们也有坏消息。当您到达数据时,您意识到没有关于标签所需的子类别信息。
我们可以克服将上面的数据框与原始数据连接起来的挑战。当我加入数据时,我计算了原始数据和其他数据的比例。这些值有意转换为字符。 temp
是添加标签所需的数据集。
library(dplyr)
library(ggplot2)
library(ggmosaic)
# Add proportion for each and convert to character for join
df <- group_by(df, Category) %>%
mutate(prop = as.character(round(Weight / sum(Weight),3)))
# Add proportion for each and convert to character.
# Get x and y values for positions
# Use prop for join
temp <- ggplot_build(g)$data %>%
as.data.frame %>%
transmute(prop = as.character(round(ymax - ymin, 3)),
x.position = (xmax + xmin) / 2,
y.position = (ymax + ymin) / 2) %>%
right_join(df)
g + geom_text(x = temp$x.position, y = temp$y.position, label = temp$Subcategory)
使用以下数据:
Category <- c("Bankpass", "Bankpass", "Bankpass", "Moving", "Moving")
Subcategory <- c("Stolen", "Lost", "Login", "Address", "New contract")
Weight <- c(10,20,13,40,20)
Duration <- as.character(c(0.2,0.4,0.5,0.44,0.66))
Silence <- as.character(c(0.1,0.3,0.25,0.74,0.26))
df <- data.frame(Category, Subcategory, Weight, Duration, Silence)
我用它来创建以下马赛克图:
library (ggplot2)
library (ggmosaic)
g <- ggplot(data = df) +
geom_mosaic(aes(weight = Weight, x = product(Category), fill = Duration),
offset = 0, na.rm = TRUE) +
theme(axis.text.x = element_text(angle = -25, hjust = .1)) +
theme(axis.title.x = element_blank()) +
scale_fill_manual(values = c("#e8f5e9", "#c8e6c9", "#a5d6a7", "#81c784", "#66bb6a"))
这可行,但我想在图表的元素上包含文本标签("Showing fe stolen, lost" 等)
然而,当我这样做时:
g + geom_text(x = Category, y = Subcategory, label = Weight)
我收到以下错误:
Error in UseMethod("rescale") : no applicable method for 'rescale' applied to an object of class "character"
想知道这里出了什么问题吗?
我想你正在寻找这样的东西
library(ggplot2)
library(ggmosaic)
您的数据:
Category <- c("Bankpass", "Bankpass", "Bankpass", "Moving", "Moving")
Subcategory <- c("Stolen", "Lost", "Login", "Address", "New contract")
Weight <- c(10,20,13,40,20)
Duration <- as.character(c(0.2,0.4,0.5,0.44,0.66))
Silence <- as.character(c(0.1,0.3,0.25,0.74,0.26))
mydf <- data.frame(Category, Subcategory, Weight, Duration, Silence)
ggplot(data = mydf) +
geom_mosaic(aes( x = product(Duration, Subcategory), fill=factor(Duration)), na.rm=TRUE) +
theme(axis.text.x=element_text(angle=-25, hjust= .1)) +
labs(x="Subcategory", title='f(Duration, Subcategory | Category)') +
facet_grid(Category~.) +
guides(fill=guide_legend(title = "Duration", reverse = TRUE))
输出为:
这几乎是您在 ggmosaic
包上所能做的最好的了。您应该尝试其他软件包。
祝你的项目工作顺利 ;-)
这是我的尝试。 x 轴位于离散变量(即类别)中。所以你不能在 geom_text()
中使用它。您不知何故需要为轴创建一个数字变量。同样,您需要找到标签在 y 轴上的位置。为了获得两个维度的数值,我决定访问图形后面的数据框。当您使用 ggmosaic
包时,在这种情况下,图形后面有一个数据框。您可以使用 ggplot_build()
获取它。您可以使用数据框中的信息(例如 xmin 和 xmax)计算 x 和 y 值。这是个好消息。但是,我们也有坏消息。当您到达数据时,您意识到没有关于标签所需的子类别信息。
我们可以克服将上面的数据框与原始数据连接起来的挑战。当我加入数据时,我计算了原始数据和其他数据的比例。这些值有意转换为字符。 temp
是添加标签所需的数据集。
library(dplyr)
library(ggplot2)
library(ggmosaic)
# Add proportion for each and convert to character for join
df <- group_by(df, Category) %>%
mutate(prop = as.character(round(Weight / sum(Weight),3)))
# Add proportion for each and convert to character.
# Get x and y values for positions
# Use prop for join
temp <- ggplot_build(g)$data %>%
as.data.frame %>%
transmute(prop = as.character(round(ymax - ymin, 3)),
x.position = (xmax + xmin) / 2,
y.position = (ymax + ymin) / 2) %>%
right_join(df)
g + geom_text(x = temp$x.position, y = temp$y.position, label = temp$Subcategory)