Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用表达式时显示右对齐轴文本

使用表达式时显示右对齐轴文本
EN

Stack Overflow用户
提问于 2019-03-16 11:46:09
回答 1查看 1.9K关注 0票数 3

我正在制作一个条形图与长轴标签,我需要包装和正确对齐。唯一复杂的是,我需要添加一个表达式才有上标。

代码语言:javascript
运行
AI代码解释
复制
library(ggplot2)
library(scales) 
df <- data.frame("levs" = c("a long label i want to wrap",
                            "another also long label"),
                 "vals" = c(1,2))

p <- ggplot(df, aes(x = levs, y = vals)) + 
  geom_bar(stat = "identity") +  
  coord_flip() + 
  scale_x_discrete(labels = wrap_format(20))

它产生预期的结果:

与正确包装的文本与所有标签完全对齐。

但是,现在我尝试使用下面的代码添加上标,并且轴文本对齐会发生变化:

代码语言:javascript
运行
AI代码解释
复制
p <- ggplot(df, aes(x = levs, y = vals)) + 
  geom_bar(stat = "identity") +  
  coord_flip() + 
  scale_x_discrete(labels = c(expression("exponent"^1),
                              wrap_format(20)("another also long label")))

(注意,我不能使用unicode,因为它不适用于我需要使用的字体,这是向其他有相同问题的人推荐的)。

即使其中一个轴标签包含表达式,我如何才能使轴文本对齐?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-17 07:28:18

这是一件奇怪的事情,但如果向量(例如标签的字符向量)包含由expression()创建的对象,则整个向量似乎被视为表达式:

代码语言:javascript
运行
AI代码解释
复制
# create a simple vector with one expression & one character string
label.vector <- c(expression("exponent"^1),
                  wrap_format(20)("another also long label"))

> sapply(label.vector, class) # the items have different classes when considered separately
[1] "call"      "character"

> class(label.vector) # but together, it's considered an expression
[1] "expression"

..。表达式总是左对齐的。这并不是ggplot特有的现象;我们还可以在基本绘图函数中观察到这一点:

代码语言:javascript
运行
AI代码解释
复制
# even with default hjust = 0.5 / vjust = 0.5 (i.e. central alignment), an expression is 
# anchored based on the midpoint of its last line, & left-aligned within its text block
ggplot() +
  annotate("point", x = 1:2, y = 1) +
  annotate("text", x = 1, y = 1, 
           label = expression("long string\nwith single line break"))+
  annotate("text", x = 2, y = 1, 
           label = expression("long string\nwith multiple line\nbreaks here")) +
  xlim(c(0.5, 2.5))

# same phenomenon observed in base plot
par(mfrow = c(1, 3))
plot(0, xlab=expression("short string"))
plot(0, xlab=expression("long string\nwith single line break"))
plot(0, xlab=expression("long string\nwith multiple line\nbreaks here"))

解决办法

如果我们可以强制每个标签单独考虑,而不受标签向量中其他标签的影响,那么非表达式标签就可以像普通字符串一样对齐。实现这一目的的一种方法是将ggplot对象转换为grob,并将y轴标签的单个textGrob替换为多个文本grobs,每个标签一个。

筹备工作:

代码语言:javascript
运行
AI代码解释
复制
# generate plot (leave the labels as default)
p <- ggplot(df, aes(x = levs, y = vals)) + 
  geom_bar(stat = "identity") +  
  coord_flip()
p

# define a list (don't use `c(...)` here) of desired y-axis labels, starting with the
# bottom-most label in your plot & work up from there
desired.labels <- list(expression("exponent"^1),
                       wrap_format(20)("another also long label"))

Grob黑客:

代码语言:javascript
运行
AI代码解释
复制
library(grid)
library(magrittr)

# convert to grob object
gp <- ggplotGrob(p)

# locate label grob in the left side y-axis
old.label <- gp$grobs[[grep("axis-l", gp$layout$name)]]$children[["axis"]]$grobs[[1]]$children[[1]]

# define each label as its own text grob, replacing the values with those from
# our list of desired y-axis labels
new.label <- lapply(seq_along(old.label$label),
                    function(i) textGrob(label = desired.labels[[i]],
                                         x = old.label$x[i], y = old.label$y[i],
                                         just = old.label$just, hjust = old.label$hjust,
                                         vjust = old.label$vjust, rot = old.label$rot,
                                         check.overlap = old.label$check.overlap,
                                         gp = old.label$gp))

# remove the old label
gp$grobs[[grep("axis-l", gp$layout$name)]]$children[["axis"]]$grobs[[1]] %<>%
  removeGrob(.$children[[1]]$name)

# add new labels
for(i in seq_along(new.label)) {
  gp$grobs[[grep("axis-l", gp$layout$name)]]$children[["axis"]]$grobs[[1]] %<>%
    addGrob(new.label[[i]])
}

# check result
grid.draw(gp)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55200820

复制
相关文章
如何在Linux桌面下使用PyGObject创建GUI应用程序
在Linux上创建应用程序可以使用不同的方法,但是有一些有限的方法,所以使用最简单和最功能的编程语言和库,这就是为什么我们要快速查看在Linux下创建应用程序使用桌面上的GTK +库被称为“PyGObject”Python编程语言。
用户2323866
2021/06/18
3.9K0
python编程之GUI的选择
前言:本文来自于网络位置http://www.2cto.com/kf/201009/74917.html。尽管内容可能有些老,但是没有关系,对于想深入Python开发的工作者,在选择GUI开发包,乃至可视化IDE方面都还有相当的借鉴意义。
py3study
2020/01/10
1.5K0
用 Python 构建漂亮的 GUI
在 Python 中构建 GUI 是我最喜欢做的事情之一,无论是显示一些文本的基本页面,还是构建公司使用的完整应用程序,Python 都可用于开发这些以及介于两者之间的所有应用程序。
吾非同
2021/07/12
1.9K0
用 Python 构建漂亮的 GUI 应用
Tkinter 是最受欢迎的软件包之一,它允许您使用 Python 构建 GUI,Tkinter Designer 软件包通过添加 Figma API 来开发更好看的 GUI 来构建此软件包!
用户8949263
2022/04/08
1.2K0
用 Python 构建漂亮的 GUI 应用
GUI引发的一场脑部大战|wine、wsl、mono、gtk、qt
wine可以运行大部分Windows软件,实在不行还有虚拟机,虚拟机性能弱,还可以进行远程服务器玩耍。
landv
2019/10/15
1.7K0
GUI引发的一场脑部大战|wine、wsl、mono、gtk、qt
fedora 安装gtk3开发环境
要用fedora开发gtk3,对系统的最低要求是:系统必须是fedora15即以上版本
py3study
2020/01/09
1.6K0
Ubuntu18.04 ROS1Melodic ROS2Dashing 机器人工具集学习镜像的制作说明 Pinguy
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
zhangrelay
2019/10/24
1.6K0
Ubuntu18.04 ROS1Melodic ROS2Dashing 机器人工具集学习镜像的制作说明 Pinguy
python开发_IDEL(Python GUI)的使用方法
在这篇blog"Python开发_python的安装"里面你会了解到python的安装。
Hongten
2018/09/13
4790
python开发_IDEL(Python GUI)的使用方法
msys2安装与使用_mingw使用教程
使用[清华大学开源软件镜像站]中的地址,修改\etc\pacman.d目录下的三个文件。
全栈程序员站长
2022/09/20
2.6K0
msys2安装与使用_mingw使用教程
Code::Blocks配置GTK+2和GTK+3
一:安装codeblock10.05和GTK+开发包 到 http://www.codeblocks.org 下载最新版的codeblock,我一般会选择带MinGW编译器的版本! 文件名是codeblocks-12.11mingw-setup.exe或者其他版本,下载完成后运行安装文件,一步步安装到结束。 下载安装GTK+开发包 For GTK+2: 到 http://www.gtk.org/ 下载GTK+开发包,注意是下载all-in-one bundle,但不要下载2.24.10这个版本,因为该版
zhwhong
2018/05/16
2.3K0
Python 常用的GUI框架都有哪些
Graphical User Interface,简称 GUI,又称图形化用户接口,所谓的GUI编程,指的是用户不需要输入代码指令,只通过图形界面的交互就可以操作软件功能。
吾非同
2020/12/07
3K0
Python 常用的GUI框架都有哪些
gtk还有人用吗_iperf使用方法
GTK+(GIMP Toolkit)是一套源码以LGPL许可协议分发、跨平台的图形工具包。最初是为GIMP写的,已成为一个功能强大、设计灵活的一个通用图形库,是GNU/Linux下开发图形界面的应用程序的主流开发工具之一。并且,GTK+也有Windows版本和Mac OS X版。 GTK+ 是一种图形用户界面(GUI)工具包。也就是说,它是一个库(或者,实际上是若干个密切相关的库的集合),它支持创建基于 GUI 的应用程序。可以把 GTK+ 想像成一个工具包,从这个工具包中可以找到用来创建 GUI 的许多已经准备好的构造块。差不多已经 10 年过去了。今天,在 GTK+ 的最新稳定版本 —— 2.8 版上(3.0测试中),仍然在进行许多活动,同时,GIMP 无疑仍然是使用 GTK+ 的最著名的程序之一,不过它已经不是惟一的使用 GTK+ 的程序了。已经为 GTK+ 编写了成百上千的应用程序,而且至少有两个主要的桌面环境(Xfce 和 GNOME)用 GTK+ 为用户提供完整的工作环境。 GTK+虽然是用C语言写的,但是您可以使用你熟悉的语言来使用GTK+,因为GTK+已经被绑定到几乎所有流行的语言上,如:C++,PHP, Guile,Perl, Python, TOM, Ada95, Objective C, Free Pascal, and Eiffel。
全栈程序员站长
2022/11/01
1.3K0
gtk还有人用吗_iperf使用方法
GTK 菜单的创建详解
============================================================================== 创建菜单条
RainMark
2019/09/10
1.6K0
ILMerge-GUI的使用
去这里下载: 这里下载ILMerge,http://www.microsoft.com/en-us/download/details.aspx?id=17630 这里下载ILMerge-GUI,htt
庞小明
2018/03/09
2.4K0
ILMerge-GUI的使用
【python入门项目】使用 Tkinter 的 Python 日历 GUI 应用程序
在 Python 中,我们可以使用 Tkinter 制作 GUI。如果你非常有想象力和创造力,你可以用 Tkinter 做出很多有趣的东西。在这里,我们将使用 Tkinter 制作一个 Python 日历 GUI 应用程序。在这个应用程序中,用户必须输入你想要查看日历的年份,然后日历才会出现。
程序员小新
2022/01/08
2.3K0
数独的暴力回溯解法和Python GUI版
数独起源于18世纪初瑞士数学家欧拉等人研究的拉丁方阵,20世纪70年代,经过美国及日本学者的推广和改良,定名为数独(Sudoku),大致的意思是“独个的数字”或“只出现一次的数字”。
蛰虫始航
2019/12/12
1.6K0
数独的暴力回溯解法和Python GUI版
Mybatis源码本地化构建Demo
上一篇文章中专门整理了如何构建Mybatis源码,小伙伴们可以在本地写demo跟踪或者注释修改源码等等骚操作。。。本篇就是为小伙伴们介绍一下如何本地化构建demo。 这里分享一下mybatis的中文官方文档,小编构建本地化demo时参考了官方文档。
沁溪源
2020/09/02
6020
iOS字符串的本地化(APP 内的本地化切换) 、nib本地化、图片本地化
使用本地化功能,可以轻松地将应用程序翻译成多种语言,甚至可以翻译成同一语言的多种方言
公众号iOS逆向
2021/07/05
1.7K0
iOS字符串的本地化(APP 内的本地化切换) 、nib本地化、图片本地化
Python安装cairo、gtk等问题
上一篇博文关于cairo的安装,使用过程中发现,画图还需要gtk等模块,所以需要继续安装。我安装gtk的过程很是折腾啊,下载了好多版本,不同格式文件,但最终还是安装成功了,哈哈,现把安装过程记录如下:
py3study
2020/01/10
2.4K0
设计一个界面,很简单!
本周,小编给大家分享在Python中如何制作一个简单的图形界面吧,Python里有很多图形用户界面库,如Tkinter, Pmw, wxPython, PySide, PyQt, PyGTk, win32ui, Glade等,在这些库中,小编只会Tkinter、wxPython和PyQt三种库,由于内置库Tkinter最为简单实用,所以就先从它开始吧,其他库以后慢慢介绍吧!接下来,我将给大家简单地介绍一下Tkinter的使用方法。 一、简单说明 首先,我对Tkinter这一模块做一个简要地说明。 Tkint
企鹅号小编
2018/01/22
2.7K0
设计一个界面,很简单!

相似问题

根据时间戳删除firestore中的项目

138

按带时间戳的数组删除对象

10

如何从UTC日期时间戳中删除时间戳

13

Python:从PriorityQueue中清除项目

11

如何从两个带时间戳的表中删除用户

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档