这实际上是两个问题中的一个(不确定是否违反SO规则,但无论如何).
第一个问题是我如何强迫一个geom_text适合geom_bar?(动态根据绘制的值)
环顾四周,我发现的解决方案正在改变标签的大小.这当然有效,但不适用于所有情况.您可以更改特定绘图的大小以使文本适合条形,但是当数据更改时,您可能需要再次手动更改文本的大小.我现实生活中的问题是,我需要为不断变化的数据(每日)生成相同的图,所以我无法真正手动调整每个图的大小.
我尝试将标签的大小设置为数据的函数.它有点工作,不完美,但适用于许多情况.
但这是另一个问题,即使标签适合栏内,重新调整情节会使一切变得混乱.调查一下,我也在ggplot文档中找到了
标签确实有高度和宽度,但它们是物理单位,而不是数据单位.它们在该绘图上占用的空间量在数据单位中不是恒定的:当您调整绘图大小时,标签保持相同的大小,但轴的大小会发生变化.
这让我想到了第二个问题:是否可以更改此默认行为并让/使图表调整大小?
还让我提炼我的第一个问题.是否可以强制a geom_text适合a geom_bar,使用物理单位和数据单元之间的聪明关系动态设置文本的大小?
所以,为了遵循良好的做法,这是我可重复的例子:
set.seed(1234567)
data_gd <- data.frame(x = letters[1:5],
y = runif(5, 100, 99999))
ggplot(data = data_gd,
mapping = aes(x = x, y = y, fill = x)) +
geom_bar(stat = "identity") +
geom_text(mapping = aes(label = y, y = y/2))
Run Code Online (Sandbox Code Playgroud)
此代码生成此图:
如果我只是简单地调整绘图大小," 标签保持相同的大小,但轴的大小会发生变化 ",从而使标签适合条形图(现在标签甚至可能太小).
所以,这是我的第二个问题.标签调整大小并保持纵横比相对于条形图会很好.任何想法如何实现这一点或是否有可能?
好的,但回到如何在条形图中标注标签,最简单的解决方案是设置标签的大小.
ggplot(data = data_gd,
mapping = aes(x = x, y = y, fill = x)) +
geom_bar(stat = …Run Code Online (Sandbox Code Playgroud) 此问题与 创建自定义geom以计算汇总统计信息并在*绘图区域外显示* (注意:所有函数都已简化;没有错误检查正确的对象类型,NA等)
在基础R中,很容易创建一个生成条带图的函数,其中样本大小在分组变量的每个级别下面指示:您可以使用以下mtext()函数添加样本大小信息:
stripchart_w_n_ver1 <- function(data, x.var, y.var) {
x <- factor(data[, x.var])
y <- data[, y.var]
# Need to call plot.default() instead of plot because
# plot() produces boxplots when x is a factor.
plot.default(x, y, xaxt = "n", xlab = x.var, ylab = y.var)
levels.x <- levels(x)
x.ticks <- 1:length(levels(x))
axis(1, at = x.ticks, labels = levels.x)
n <- sapply(split(y, x), length)
mtext(paste0("N=", n), side = 1, line = 2, at = x.ticks)
}
stripchart_w_n_ver1(mtcars, …Run Code Online (Sandbox Code Playgroud) 有没有办法让geom_curve上的箭头关闭?相同的代码适用于geom_segment.也许这是一个错误?
library(tidyverse)
set.seed(123)
data <- data_frame(x = rnorm(10), y = rnorm(10))
# NO ARROWHEAD FILL
ggplot(data, aes(x, y)) +
geom_point() +
geom_curve(aes(x = 0, y = 0, xend = 1, yend = 1),
color = "black",
arrow = arrow(type = "closed"))
# ARROWHEAD FILL WORKS
ggplot(data, aes(x, y)) +
geom_point() +
geom_segment(aes(x = 0, y = 0, xend = 1, yend = 1),
color = "black",
arrow = arrow(type = "closed"))
Run Code Online (Sandbox Code Playgroud) coord_cartesian不允许设置每个面的坐标,并且使用其他范围限制往往会在特定的极端产生一条直线。由于我们有广泛变化的 y 范围,我们不能在所有方面设置相同的限制;在绘图之前限制数据与geom_line/ geom_path( /sf/answers/1912385051/ )不太友好,因为插入数据以到达边缘然后插入NAs 以打破上线。(最终,获得所需结果的唯一方法就是这样做,这对于其他数据来说可能有点繁重。)
https://gist.github.com/burchill/d780d3e8663ad15bcbda7869394a348a 中建议了一种解决方法,它以
test_data %>%
ggplot(aes(x=Nsubjects, y = Odds, color=EffectSize)) +
facet_wrap(DataType ~ ExpType, labeller = label_both, scales="free") +
geom_line(size=2) +
geom_ribbon(aes(ymax=Upper, ymin=Lower, fill=EffectSize, color=NULL), alpha=0.2)
Run Code Online (Sandbox Code Playgroud)
在 之前的版本中ggplot2,该要点定义coord_panel_ranges并能够控制每个方面的坐标。两个右侧面应缩小到 1-6(ish) y 轴,以便爆炸置信区间离开屏幕,并允许面主要关注数据的“正常范围”。(注意:这个test_data和这个 vis 不是我的,它取自 gist。虽然我的需求有些相似,但我认为最好留在 gist 的数据和代码的范围内。)
不幸的是,这对我来说现在失败了ggplot2-3.3.0。与最近丢失的 相关的初始错误ggplot2::scale_range,我试图通过对 burchill 代码(使用其他ggplot2:::内部函数)的这种改编来减轻这些错误:
UniquePanelCoords <- ggplot2::ggproto(
"UniquePanelCoords", ggplot2::CoordCartesian,
num_of_panels = 1,
panel_counter = 1,
panel_ranges = …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个facet_multi_col()函数,该facet_col()函数类似于中的函数ggforce-允许使用空格参数(在中不可用facet_wrap())进行构面布局-但可以在多个列上使用。就像下面的最后一个图(用创建grid.arrange())一样,我不希望这些小平面必须在行之间对齐,因为每个小平面的高度将根据y我希望使用的类别变量而变化。
ggproto阅读扩展指南后,我发现自己已经完全脱离了深度。我认为最好的方法是传递一个布局矩阵来指示在哪里断开数据对应子集的列,并facet_col 在ggforce中进行构建以包括一个空间参数-请参阅问题的结尾。
我不满意的选择的快速说明
library(tidyverse)
library(gapminder)
global_tile <- ggplot(data = gapminder, mapping = aes(x = year, y = fct_rev(country), fill = lifeExp)) +
geom_tile()
global_tile
Run Code Online (Sandbox Code Playgroud)
global_tile +
facet_wrap(facets = "continent", scales = "free")
Run Code Online (Sandbox Code Playgroud)
facet_wrap()没有空格参数,这表示每个大陆的磁贴大小不同,使用coord_equal()会引发错误
library(ggforce)
global_tile +
facet_col(facets = "continent", scales = "free", space = "free", strip.position = "right") +
theme(strip.text.y = element_text(angle = 0))
Run Code Online (Sandbox Code Playgroud)
我一直在阅读关于扩展ggplot2的小插图,但我有点担心如何制作一个可以为绘图添加多个几何的单个geom.ggplot2 geoms中已存在多个几何,例如,我们有geom_contour(多个路径)和geom_boxplot(多个路径和点)之类的东西.但我不太清楚如何将它们扩展到新的geoms中.
假设我试图geom_manythings通过计算单个数据集来绘制两个多边形和一个点.对于所有点,一个多边形将是凸包,第二个多边形将是用于点的子集的凸包,并且单个点将表示数据的中心.我想通过调用一个geom而不是三个单独的调用来显示所有这些,如我们在这里看到的:
# example data set
set.seed(9)
n <- 1000
x <- data.frame(x = rnorm(n),
y = rnorm(n))
# computations for the geometries
# chull for all the points
hull <- x[chull(x),]
# chull for all a subset of the points
subset_of_x <- x[x$x > 0 & x$y > 0 , ]
hull_of_subset <- subset_of_x[chull(subset_of_x), ]
# a point in the centre of the data
centre_point <- …Run Code Online (Sandbox Code Playgroud) 作为从我已经创建的绘图(此处为 SO链接)中删除特定geom的努力的一部分,我想动态确定ggplot2对象的每个层的geom类型.
假设我不知道添加图层的顺序,有没有办法动态查找具有特定geom的图层?如果我像下面那样打印出图层,我可以看到图层存储在列表中,但我似乎无法访问geom类型.
library(ggplot2)
dat <- data.frame(x=1:3, y=1:3, ymin=0:2, ymax=2:4)
p <- ggplot(dat, aes(x=x, y=y)) + geom_ribbon(aes(ymin=ymin, ymax=ymax), alpha=0.3) + geom_line()
p$layers
[[1]]
mapping: ymin = ymin, ymax = ymax
geom_ribbon: na.rm = FALSE, alpha = 0.3
stat_identity:
position_identity: (width = NULL, height = NULL)
[[2]]
geom_line:
stat_identity:
position_identity: (width = NULL, height = NULL)
Run Code Online (Sandbox Code Playgroud)
我不熟悉原型对象,我从原型文档中尝试的东西似乎不起作用(例如p$layers[[1]]$str()).
感谢下面的答案,我能够提出一个动态删除图层的功能:
remove_geom <- function(ggplot2_object, geom_type) {
layers <- lapply(ggplot2_object$layers, function(x) if(x$geom$objname == geom_type) NULL else x)
layers <- layers[!sapply(layers, …Run Code Online (Sandbox Code Playgroud) 我不久前刚开始与R合作,我目前正在努力加强我的可视化技能.我想要做的是创建带有平均钻石的箱形图作为顶层(参见下面链接中的图片).我没有找到任何已经完成此功能的功能,所以我想我必须自己创建它.

我希望做的是创建一个geom或stat,允许这样的东西工作:
ggplot(data, aes(...))) +
geom_boxplot(...) +
geom_meanDiamonds(...)
Run Code Online (Sandbox Code Playgroud)
我不知道从哪里开始构建这个新功能.我知道平均钻石需要哪些值(平均值和置信区间),但我不知道如何构建从中获取数据的geom/stat ggplot(),计算每个组的平均值和CI,并绘制平均值.每个箱图的顶部.
我已经搜索了如何从头开始构建这些类型的函数的详细描述,但是,我还没有找到任何真正从底部开始的东西.我真的很感激,如果有人能指出我一些有用的指南.
谢谢!
我已经构建了这个新的ggplot2几何层,我称之为geom_triangles(参见https://github.com/ctesta01/ggtriangles/),它根据美学绘制等腰三角形,包括三角形的x, y, z高度z和等腰三角形的底边的中点图表上的 (x,y)。
我想要的是geom_triangles()图层自动提供三角形高度和宽度的图例组件,但我不知道如何做到这一点。
根据此参考资料,我了解我可能需要调整对象draw_key中的参数ggproto StatTriangles,但我不确定如何做到这一点,并且似乎无法在网上找到如何做到这一点的示例。我一直在查看这些函数的源代码,但我不确定如何在.ggplot2draw_keydraw_keyStatTriangles ggproto
library(ggplot2)
library(magrittr)
library(dplyr)
library(ggrepel)
library(tibble)
library(cowplot)
library(patchwork)
StatTriangles <- ggproto("StatTriangles", Stat,
required_aes = c('x', 'y', 'z'),
compute_group = function(data, scales, params, width = 1, height_scale = .05, width_scale = .05, angle = 0) {
# specify default width
if (is.null(data$width)) data$width <- 1
# for each row of …Run Code Online (Sandbox Code Playgroud) 绘制条形图时,我经常向条形图添加标签以表示每个条形图的 y 值。然而,当标准变得太低时,我会遇到麻烦,使标签不可读或丑陋。
library(ggplot2)
df_blood <- data.frame(blood_type = c("O-", "O+", "A-", "A+", "B-", "B+", "AB-", "AB+"),
frequency = c(0.13, 0.35, 0.08, 0.3, 0.02, 0.08, 0.01, 0.02))
ggplot(df_blood, aes(x = blood_type, y = frequency, fill = blood_type)) +
geom_bar(stat = "identity") +
geom_text(aes(label = frequency), color = "blue", vjust = 1, size = 7)
Run Code Online (Sandbox Code Playgroud)

由reprex 包(v0.3.0)于 2021-01-25 创建
。查看 的栏AB-,我们可以看到文本0.01超出了栏的高度(在栏的底部)。在这种情况下,我想将vjustof更改geom_text()为0.
在这里我使用size = 7与上面相同的geom_text() …