ggplot2:显示 x 轴标签的类别和子类别

2023-12-13

big_theme <- theme(
  panel.background = element_rect(fill = "black"),
  plot.background = element_rect(fill = "black", colour = NA),
  plot.title = element_text(hjust = 0.5, size = 15, color = "white"),
  axis.text.y = element_text(colour = "white", size = 14),
  axis.title.x = element_text(colour = "white", size = 14),
  axis.title.y = element_text(colour = "white", size = 14),
  axis.text.x = element_text(vjust = 1, angle = 45, color = "white", size = 14, hjust=1),
  strip.background = element_rect(fill = "black"),
  strip.text = element_text(colour = 'white'),
  strip.text.y = element_text(angle = 0), 
  legend.position = "top"
)

theme2 = theme(panel.background = element_rect(fill = 'black'),
  legend.background=element_rect(fill = "black"),
  legend.text = element_text(colour = "white", size = 14), 
  legend.justification = "right",
  legend.key.height = unit(1, "line"),
  legend.key = element_rect(color = "black", fill = "black"))

theme3 = theme(plot.background = element_rect(fill = 'black'))

plot1 <- ggplot(sample_data) + big_theme + theme2 + theme3
plot1 + 
  geom_col(position = "identity", 
           aes(x = category, y = value,
               fill = forcats::fct_relevel(variable, c("z", "x", "y")),
               color = forcats::fct_relevel(variable, c("z", "x", "y")))) + 
  scale_fill_manual(values = c("#000000","#D3667C","#53AC79")) + 
  scale_color_manual(values = c("#00A2EF","#D3667C","#53AC79")) + 
  geom_text(aes(label = big_category, x = big_category, y = 0), vjust = 0, 
            size = 3, color = "white", position = position_dodge(width = 1)) +  
  scale_y_continuous(limits = c(0, 2.4), expand = c(0, 0)) 

我有一个数据集,如下所示:

big_category category   variable    value
a     aa    x   1.2
a     ba    x   1.05
a     ca    x   1.11
a     aa    y   1.43
a     ba    y   1.09
a     ca    y   0.97
a     aa    z   1.12
a     ba    z   1.46
a     ca    z   1.32

b     ab    x   1.2
b     bb    x   1.05
b     cb    x   1.11
b     ab    y   1.43
b     bb    y   1.09
b     cb    y   0.97
b     ab    z   1.12
b     bb    z   1.46
b     cb    z   1.32
c     ac    x   1.2
c     ac    y   1.05
c     ac    z   1.11

我希望 x 轴按类别标记,在其下方我想要 big_category 的标签。例如,我想要 aa、ba 和 ca 的轴标签,然后在 ggplot 中为 big_category a 提供一个标签。我不希望它与类别标签混合在一起,而且我还希望它位于水平显示的 x 轴标签下方。

我也尝试过facet_grid,但这给了我一个问题,因为条形的大小不均匀。就像 big_category a 有 3 个类别,但 big_category c 只有 1 个类别。我希望它们都具有相同的宽度,并且我想要一个连续的图。

Update

big_category category variable value
a aa111111111 x 1.2
a ba111111111 x 1.05
a ca111111111 x 1.11
a aa111111111 y 1.43
a ba111111111 y 1.09
a ca111111111 y 0.97
a aa111111111 z 1.12
a ba111111111 z 1.46
a ca111111111 z 1.32
b ab111111111 x 1.2
b ab111111111 y 1.05
b ab111111111 z 1.11
c ac111111111 x 1.2
c bc111111111 x 1.05
c cc111111111 x 1.11
c ac111111111 y 1.43
c bc111111111 y 1.09
c cc111111111 y 0.97
c ac111111111 z 1.12
c bc111111111 z 1.46
c cc111111111 z 1.32

Code:

big_theme <- theme(
panel.background = element_rect(fill = "black"),
plot.background = element_rect(fill = "black", colour = NA),
plot.title = element_text(hjust = 0.5, size = 15, color = "white"),
axis.text.y = element_text(colour = "white", size = 14),
axis.title.x = element_text(colour = "white", size = 14),
axis.title.y = element_text(colour = "white", size = 14),
axis.text.x = element_text(vjust = 1, angle = 45, color = "white", size = 14, hjust=1),
strip.background = element_rect(fill = "black"),
strip.text = element_text(colour = 'white'),
strip.text.y = element_text(angle = 0),
legend.position = "top"
)

theme2 = theme(panel.background = element_rect(fill = 'black'),
legend.background=element_rect(fill = "black"),
legend.text = element_text(colour = "white", size = 14),
legend.justification = "right",
legend.key.height = unit(1, "line"),
legend.key = element_rect(color = "black", fill = "black"))

theme3 = theme(plot.background = element_rect(fill = 'black'))

ggplot(sample_data %>% mutate(variable=fct_relevel(variable, c("z","x","y")))) +
geom_col(position = "identity",
aes(x = category, y = value, fill = variable, color = variable)) +
facet_grid(. ~ big_category, space="free_x", scales="free_x", switch="x") +
big_theme + theme2 + theme3 +
theme(strip.placement = "outside",
strip.background = element_rect(fill=NA,colour="white"),
panel.spacing.x=unit(0,"cm"),
strip.text = element_text(hjust=0, face="bold", size=12))

下面是一个使用示例数据的示例,说明如何category之内big_category。为了简单起见,我只包含了基本的情节元素。当然,您可以将特定的主题、颜色和其他元素添加到下面的基本图中。

library(tidyverse)

ggplot(sample_data %>% mutate(variable=fct_relevel(variable, c("z","x","y")))) +
  geom_col(position = "identity", 
           aes(x = category, y = value, fill = variable, color = variable)) + 
  facet_grid(. ~ big_category, space="free_x", scales="free_x", switch="x") +
  theme_classic() +
  theme(strip.placement = "outside",
        strip.background = element_rect(fill=NA, colour="grey50"),
        panel.spacing.x=unit(0,"cm"))

enter image description here

UPDATE:如果我理解您的评论,这里有更新的代码,用于左对齐条带文本并删除条带边框。我不知道有什么方法(无需破解 ggplot 之外的底层图形对象)可以在条带之间仅显示垂直线。不过,我在面板之间添加了一些空间,并添加了面板边框来描绘big_category levels.

ggplot(sample_data %>% mutate(variable=fct_relevel(variable, c("z","x","y")))) +
  geom_col(position = "identity", 
           aes(x = category, y = value, fill = variable, color = variable)) + 
  facet_grid(. ~ big_category, space="free_x", scales="free_x", switch="x") +
  theme_bw() +
  theme(strip.placement = "outside",
        strip.background = element_rect(fill=NA,colour=NA),
        panel.spacing.x=unit(0.15,"cm"), 
        strip.text = element_text(hjust=0, face="bold", size=12))

enter image description here

更新2:我创建了一个具有以下更改的绘图:(1)big_categoryx 轴标签左端的标签,以及 (2) 空白big_category标签时category少于 3 个独特关卡。为了保持相同的方面“中断”与空白标签,我们为每个前者创建一个唯一的空白字符串(通过改变字符串的长度)big_category value.

我不认为这个情节看起来很好(实际上我认为它会与big_category侧面条位于其标准位置并且文本居中),但也许您可以尝试一下并获得满足您需求的东西。我已经对代码进行了注释以解释它的作用,但如果有任何不清楚的地方请告诉我。

我们将使用新的sample_data您发布了,但我们将添加第四个级别big_category:

sample_data = sample_data %>% 
  bind_rows(data_frame(big_category="d",
                       category=c("da1111111111", "db111111"),
                       variable=c("z","x"), value=c(1.1,0.6)))

现在我们将进行一些转换sample_data将其设置为绘图并将调整后的数据框直接传输到 ggplot 中:

sample_data %>% 
  mutate(variable=fct_relevel(variable, c("z","x","y"))) %>% 
  # Create grouping column (called short_cat) to mark levels of big_category 
  #  with two or fewer unique levels of category
  group_by(big_category) %>% 
  mutate(short_cat = length(unique(category)) <= 2) %>% 
  ungroup %>% 
  # Create a unique white-space string for each unique value of grp
  mutate(grp = c(0, cumsum(diff(short_cat) != 0)),
         grp = sapply(grp, function(g) paste(rep(" ", g), collapse="")),
         # Assign white-space strings to each level of big_category for which short_cat 
         # is TRUE
         big_category=replace(big_category, short_cat, grp[short_cat]),
         # Set factor order for big_category so new levels will stay in same order 
         #  as original levels
         big_category=factor(big_category, levels=unique(big_category))) %>%
  ggplot() +
    geom_col(position = "identity", width=0.8, 
             aes(x = category, y = value, fill = variable, color = variable)) + 
    facet_grid(. ~ big_category, space="free_x", scales="free_x", switch="x") +
    theme_bw() +
    theme(axis.text.x=element_text(angle=45, vjust=1, hjust=1),
          strip.placement = "outside",
          strip.background = element_rect(fill=NA,colour=NA),
          panel.spacing.x=unit(0.15,"cm"), 
          # Left justify big_category labels
          strip.text = element_text(hjust=0, face="bold", size=12)) +
    # Expand left side of x-axis so that big_category labels will be under left 
    #  end of x-axis labels
    expand_limits(x=-0.5)

enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ggplot2:显示 x 轴标签的类别和子类别 的相关文章

  • 在 RcppArmadillo 中将列向量乘以数值标量

    我在编译这个简单的程序时遇到一些麻烦c 代码使用Rcpp和RcppArmadillo包裹 采用以下简单示例 将矩阵的每一列乘以数值标量 code lt arma mat out Rcpp as
  • 在 R 中提取 data.frames 列表的名称以及 data.frame 中的值

    在下面的代码中 j是 data frames 的命名列表 我想知道是否有办法 a 提取变量的数值 即one short and one long 在 data frames 内并附加它们的相关名称 即 AAA or BBB or CCC 到
  • R在Windows平台Rstudio上打印data.frames中的UTF-8代码

    当数据框中存在UTF 8字符时 将无法正常显示 例如 以下内容是正确的 gt U6731 1 朱 但是当我将其放入数据框中并打印出来时 它是 gt data frame x U6731 x 1
  • 要在子集中显示的非数字条目的维恩图

    我有以下数据框 SET1 SET2 SET3 par1 par2 par1 par2 par3 par2 par3 par4 par5 我想制作一个维恩图 其中所有这些 parX 元素都显示在各自的子集中 即作为标签 而不仅仅是重叠元素的数
  • 如何根据 ggplot2 中的汇总数据创建堆积条形图

    我正在尝试使用 ggplot 2 创建堆积条形图 我的宽格式数据如下所示 每个单元格中的数字是响应的频率 activity yes no dontknow Social events 27 3 3 Academic skills works
  • 需要在R中跳过不同数量的行

    我正在使用以下代码来处理我的数据 但最近我意识到使用skip 27 在数据开始之前跳过存储在我的文件中的信息 不是一个好的选择 因为每个文件中要跳过的行数不同我的目标是读取存储在多个文件夹中的各种txt文件 并非所有文件都有相同的列数 列的
  • case_when 与部分字符串匹配和 contains()

    我正在使用一个数据集 其中有许多名为 status1 status2 等的列 在这些列中 它表示某人是否豁免 完整 注册等 不幸的是 豁免投入并不一致 这是一个示例 library dplyr problem lt tibble perso
  • 平滑连续 2D 点

    UPDATE 感谢 user20650和 李哲源Zheyuan Li 这是我想出的解决方案 Example data set df 3600 observations points Create a vector of the cumula
  • 如何在 R 中的 dygraph 标题中使用 UTF-8 字符

    使用 Rstudio Windows8 当我使用 dygraph 函数绘制时间序列时 在尝试在主标题中使用 UTF 8 字符时遇到问题 library dygraphs dygraph AirPassengers main T tulo 这
  • 将维基百科中的表格加载到 R 中

    我正在尝试从以下 URL 将最高法院法官表加载到 R 中 https en wikipedia org wiki List of Justices of the Supreme Court of the United States http
  • 扩展数据框以使其具有与原始行中两列的范围一样多的行[重复]

    这个问题在这里已经有答案了 我有一个数据框如下 structure list symbol c u n v i a start c 9L 6L 10L 8L 7L end c 14L 15L 12L 13L 11L Names c symb
  • R 中 SVG 图形的最佳设备? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想从 R 导出 SVG 图形 似乎有两种选择 RSvgDevice 和 Cairo 有人可以对这些包发表评论吗 是默认的还是明显比另一个
  • R - 基于列名称的子集

    我的数据框有超过 120 列 变量 我想根据列名称创建子集 例如 我想创建一个子集 其中列名称包含字符串 心情 这可能吗 我一般用 SubData lt myData grep whatIWant colnames myData 我很清楚
  • HTTR GET 新错误:SSL 证书问题:证书已过期

    我已经运行这段代码几个月了 没有出现任何问题 今天我突然开始在我的两台 AWS 服务器上收到以下错误消息 错误 curl curl fetch memory url handle handle SSL证书问题 证书已过期 当尝试运行以下代码
  • 自定义轴缩放后 ggplot2 缺少标签

    我正在尝试使用我的 x 轴应用自定义缩放ggplot2 and scales trans new 但是 当我这样做时 一些轴标签丢失了 有人可以帮我弄清楚为什么吗 Setup library tidyverse the data ds lt
  • 如何将参数从 Excel/VBA 传递到 Rstudio 中的脚本

    我正在尝试使用 Rstudio 从 VBA 打开 R 脚本 同时将参数传递给 R 脚本 然后我可以使用 commandArgs 访问该脚本 该问题与此处描述的问题非常相似 WScript Shell 用于运行路径中包含空格且来自 VBA 的
  • 更改 R 中 ggplot geom_polygon 的颜色方案

    我正在使用地图库和 ggplot 的 geom polygon 创建地图 我只是想将默认的蓝色 红色 紫色配色方案更改为其他颜色 我对 ggplot 非常陌生 所以如果我没有使用正确的数据类型 请原谅 我使用的数据如下所示 gt head
  • 在 RGL 中将立方体绘制到 3D 散点图中

    我正在尝试向 3D 散点图添加较小的立方体 网格 具有指定边长 我希望立方体位于原点 我该怎么做呢 我已经玩过cube3d 但我似乎无法将立方体正确定位 也无法使其成为网格 因此我可以看到它包含的数据点 这是我所拥有的 library rg
  • 在闪亮的数据表中为每个单元格显示工具提示或弹出窗口?

    有没有什么方法可以为 r闪亮数据表中的每个单元格获取工具提示 有很多方法可以获取悬停行或列 但我找不到一种方法来获取行和列索引并为每个单元格显示不同的悬停工具提示 任何人都可以修改以下代码吗 library shiny library DT
  • 如何使用plotmath更新ggplot图例标签

    我正在尝试更新ggplot要使用的图例标签plotmath但是 当我这样做时 它将之前组合的图例分成两部分 通过一个例子可能更容易理解 test data and the default plot gives the correct col

随机推荐

  • 如果我包含某个包,Flutter Android 应用程序会在启动时崩溃

    最近突然出现了一个问题 只需将依赖项包含在 pubspec yaml 中的 位置 中 例如 dependencies flutter sdk flutter location 1 2 0 lt culprit firebase auth 0
  • 最短的GAS ARM (linux) 程序?

    我曾考虑过学习汇编语言 并决定尝试一下 ARM 我决定使用 GNU 汇编器 主要是因为它可以在我的手机存储库中找到 这样如果我感到无聊 我可以在任何地方尝试汇编 无论如何 我在网上搜索过 但找不到任何有关如何正确退出 ARM Linux 二
  • Java - 为什么强制垃圾收集不释放内存

    我正在生成一个大型数据结构并将其写入硬盘 之后我想摆脱该对象 以减少内存消耗 我的问题是 在强制垃圾收集之后 已用内存量至少与垃圾收集之前一样高 我添加了一个我正在做的最小工作示例 DataStructure data new DateSt
  • 在华为开发者控制台中为华为应用添加关键字

    我需要为用户提供在华为应用程序库中搜索我的应用程序的能力 就像苹果在应用程序商店中的关键字一样 但我在华为开发者控制台中找不到与之等效的内容 华为提供多种广告类型来帮助您增加Android应用的下载量 您可以设置字词或短语 使您的广告与用户
  • 如何将一个表单的实例传递给另一个表单

    我有一个名为form1带有在运行时创建的控件 当我按下表单上的按钮时 另一个表单会加载 称为combat and form1被隐藏 因此只有 1 种形式 combat 可见 当我按下按钮时combat我想要我的form1形成所显示的 但是我
  • jQuery 方法不适用于事件处理程序中的“this”

    当我使用下面的方法时 我无法获取 jQuerythis隐藏该元素 purplePanda click function e this hide 我收到此错误 Uncaught TypeError this hide is not a fun
  • 参数通过 ByVal 传递给 VB.NET 函数并在那里进行操作

    在此 Microsoft 示例中 将 Double 数组传递给函数MultiplyMatricesSequential and MultiplyMatricesParallel 作为参数结果使用ByVal修饰符 http msdn micr
  • Flutter:忽略小部件上的触摸事件

    我希望在其他小部件之上有一个模糊的图像 但是 当我这样做时 我无法与它下面的小部件进行交互 Solution 您可以解决您的交互问题 无法与Widget在你的模糊图像下方 通过包围你的BackdropFilter与IgnorePointer
  • 如何在支持8位无符号整数的设备上合法显示DICOM 16无符号整数?

    我正在 iOS 上开发一个医疗应用程序 iOS 设备仅支持 GL UNSIGNED BYTE 和 GL LUMINANCE 或者通常仅支持每个组件 8 位 现在我有一些灰度图像是 16 位无符号整数 我想显示它们 我发现我们无法显示 16
  • 使用any()和all()检查列表是否包含一组值或另一组值

    我的代码是针对井字游戏并检查平局状态的 但我认为这个问题在一般意义上可能更有用 我有一个代表董事会的列表 它看起来像这样 board 1 2 3 4 5 6 7 8 9 当玩家移动时 他们移动的整数将被替换为他们的标记 x 或 o 我已经进
  • Spring Security 中拦截 url 模式的顺序

    在 appSecurity xml 我有这个 拦截 url 模式 users profile 访问 hasRole VIEW PROFILES 拦截url模式 用户 个人资料 编辑 访问 hasRole EDIT PROFILES 我有一个
  • 在 PHP 中验证 XHTML5?

    背景 I have made the decision to serve my website as application xhtml xml to anyone who will accept it I understand that
  • 什么会导致此自定义 XML ModelBinder 无法反序列化我的 XML POST?

    该模型 public class SimpleUser public string FirstName get set public string LastName get set public string UserName get se
  • “composer”包管理器如何工作?

    我正在尝试安装 Krumo 它说有两种安装方法 我尝试了第一种方法 下载 PHP 文件并将其包含到我的项目中 效果很好 现在我正在尝试第二种方法 使用作曲家 当我看到它的时候 一堆问题就出现了 在哪里运行这个命令 是否相当于将 class
  • CardLayout之前的功能不起作用?

    我的卡片布局的下一个功能可以正常工作 但上一个功能却不能正常工作 就我而言 只需 layout previous 在我的 makePanel 方法的 actionPerformed 方法主体中应该可以工作 但是当我运行程序并单击上一个按钮时
  • 进程完成时超时或关闭

    我有一个X exe大约需要 2 6 小时才能完成的程序 确切的时间未知 但我希望将阈值设置为 6 5 或 7 小时 如果这个程序在这段时间内没有返回任何值 它将被杀死 我如何使用批处理来实现这个 bat files 这是我到目前为止所拥有的
  • 在我切换到 Eslint 平面配置后,VSCode 不再显示 Eslint 错误(尽管 eslint 仍然可以在终端中使用)

    我在 TypeScript Next js 项目中使用 Eslint 但我想切换到 Eslint 提供的新 平面配置 方法 我创建 eslint config js看起来像这样 https stackoverflow com a 74819
  • 反应子嵌套路由

    我正在尝试在 Reactjs 中实现子 嵌套路由 下面是我发现的用于嵌套子路由的 2 种方法 但父路由工作正常 而父组件的子路由则不然 以下是其工作原理的路线 gt Home Component login gt Login Compone
  • Vue.js 随机图像未显示

    有人知道为什么这对我不起作用吗 我正在运行 vue cli 构建 我没有收到任何错误 但图像未显示 我是 vue js 的新手 所以解决方案很可能非常简单 任何帮助是极大的赞赏
  • ggplot2:显示 x 轴标签的类别和子类别

    big theme lt theme panel background element rect fill black plot background element rect fill black colour NA plot title