R ggplot气泡图局部气泡显示没有在单个图表中
Posted
技术标签:
【中文标题】R ggplot气泡图局部气泡显示没有在单个图表中【英文标题】:R ggplot bubble chart localised bubbles display without in single chart 【发布时间】:2019-08-08 13:27:23 【问题描述】:R/ggplot 专家您好!
R 和 ggplot 学习器在这里。
我正在制作一个场景,并在思考如何以最佳方式显示数据。 我需要你们的建议和指导。
R 可重现的 ggplot:
library(ggrepel)
# Create the data frame.
sales_data <- data.frame(
emp_name <- c("Sam", "Dave", "John", "Harry", "Clark", "Kent", "Kenneth", "Richard", "Clement", "Toby"),
month <- as.factor(c("Jan", "Feb", "Mar", "Jan", "Feb", "Mar", "Jan", "Feb", "Mar", "Jan")),
dept_name <- as.factor(c("Production", "Services", "Support", "Support", "Services", "Production", "Production", "Support", "Support", "Support")),
revenue <- c(100, 200, 300, 400, 500, 600, 500, 400, 300, 200)
)
sales_data$month <- factor(sales_data$month, levels = c("Jan", "Feb", "Mar"))
categorical_bubble_chart <- ggplot(sales_data, aes(x= month, y = dept_name, size = revenue, fill = revenue, label = revenue)) +
geom_point(shape = 21, show.legend = FALSE)
categorical_bubble_chart
输出图是:
到目前为止还不错! 在当前场景中以最佳方式表示数据。这是它应该是什么样子。
我很难理解以下几点:
如何在网格线之间显示月份类别(“Jan”、“Feb”、“Mar”)。部门也是如此。这样我就可以为每个组合制作一个类似网格的区域。
现在,所有气泡都相互重叠。我想以不重叠的方式放置气泡。为此,我正在考虑在我的数据框中再添加一列并随机分配一个值,以便将其用于在网格区域内绘制它。但是我发现很难理解,当我的 x/y 已经是 month
和 dept_name
时,我可以提供什么随机值来使每个气泡彼此不同?
自过去 5-6 小时以来,我一直在考虑它的解决方案,但找不到解决方案。 任何方向或建议都将受到高度赞赏和未来读者的学习。
【问题讨论】:
【参考方案1】:您正在寻找这样的东西吗?我在你的数据中找不到每个方面的气泡位置,所以我拿了收入。
require(ggplot2)
# Create the data frame.
sales_data <- data.frame(
emp_name = c("Sam", "Dave", "John", "Harry", "Clark", "Kent", "Kenneth", "Richard", "Clement", "Toby"),
month = as.factor(c("Jan", "Feb", "Mar", "Jan", "Feb", "Mar", "Jan", "Feb", "Mar", "Jan")),
dept_name = as.factor(c("Production", "Services", "Support", "Support", "Services", "Production", "Production", "Support", "Support", "Support")),
revenue = c(100, 200, 300, 400, 500, 600, 500, 400, 300, 200)
)
sales_data$month <- factor(sales_data$month, levels = c("Jan", "Feb", "Mar"))
categorical_bubble_chart <- ggplot(sales_data, aes(x= revenue, y = revenue, size = revenue, fill = revenue, label = revenue)) +
geom_point(shape = 21, show.legend = FALSE) +
facet_grid(dept_name~month)
categorical_bubble_chart
给出:
【讨论】:
先生,您真的是R enthsiast
非常感谢!我将进一步玩这个以了解更多信息!
所以,我的理解是,我们这里有 9 个不同的图表,单张图表就没有办法吗?
我认为您可以考虑将构面之间的空间设为零,因此它看起来像一张图表。您可以使用theme()
执行此操作。如果你想有一个情节,那么你必须发明一个人工轴值,例如月份 + 收入和 dep_name + 收入。但我认为这将比坚持刻面更难、更复杂。
是的,这是一种方式。但是,如果我们使用 coord_polar()
在极坐标中绘制它,它会显示 9 个不同的极坐标。 PS:这个剧情我最后还是要以极地的方式展现出来。【参考方案2】:
作为@Wietze314 方法的替代方案,构建了“快速而肮脏”的单一图表:
ggplot(data = sales_data, aes(x = month, y = dept_name)) +
geom_tile(data = expand.grid(sales_data$month, sales_data$dept_name),
aes(x = Var1, y = Var2), fill = NA, col = 'gray50', lty = 2) +
geom_point(aes(size = revenue, col = revenue),
shape = 16, position = position_jitter(seed = 0), show.legend = F) +
geom_text(aes(label = revenue), vjust = 1.6, position = position_jitter(seed = 0)) +
theme_bw() +
theme(
axis.title = element_blank(),
axis.ticks = element_blank(),
plot.background = element_blank(),
axis.line = element_blank(),
panel.border = element_blank(),
panel.grid = element_blank()
)
【讨论】:
嗨@utubun,我可以问一下,为什么这种方法不可扩展?假设如果使用包含 500 个数据的数据运行此代码。 R 工作室挂起。 @OmPrakashSao 这很可能是因为expand.grid()
来电。如果我的数学是正确的,给定 500 分,expand.grid()
将生成一个包含 250000 行的数据框。所以在那之后,当geom_tile()
进入场景时,它必须创建250000个瓦片,这可能太多了。正如我之前所说,这是一个又快又脏 的解决方案。如果点数相对较多,最好采用@Wietze 解决方案,或者甚至更好地创建自己的stat_
和geom_
see e.g. here。以上是关于R ggplot气泡图局部气泡显示没有在单个图表中的主要内容,如果未能解决你的问题,请参考以下文章
R语言ggplot2可视化气泡图:无填充色的气泡图自定义填充色的气泡图
R语言ggplot2和gganimate包可视化动态动画气泡图(Animated Bubble chart):使用gganimate包创建可视化gif动图