【问题标题】:Putting axis labels with italics parallel to axes in R rgl package将带有斜体的轴标签与 R rgl 包中的轴平行
【发布时间】:2021-05-15 11:00:14
【问题描述】:

我正在尝试使用 R 包“rgl”创建 3D 图。我想让所有轴标签与轴平行,但 las = 0 不起作用,并且使用 text3d() 或 mtext3d() 没有运气。是否可以这样做,这取决于您所看到的数字?这是我的代码:

X = c(0, 0.2, 0.4, 0.6, 0.8, 1.0)
Y = c(0, 2, 4, 6, 8, 10)
Z = c(100, 220, 440, 660, 880, 1100)
df = data.frame(X, Y, Z)

#install.packages('rgl')
library(rgl)
# Cannot put axis labels parallel to the axes
plot3d(df$X, df$Y, df$Z, type = 'n', box = F, add = F,
xlab = 'Number of cars (N)',
ylab = 'Size (S)',
zlab = 'Weight (kg)')
plot3d(df$X, df$Y, df$Z, type = 'l', lwd = 2, add = T, col = 'blue')
rgl.snapshot('Figure1.png')

这是我在尝试尽可能好地定位轴后得到的结果。

我什至无法弄清楚这一点,但理想情况下,我想用斜体在括号中制作字母,但它不允许我使用替代,它被忽略了。这是我的代码:

# Cannot use italics in the labels
plot3d(df$X, df$Y, df$Z, type = 'n', box = F, add = F,
xlab = substitute(paste('Number of cars (', italic('N'), ')')),
ylab = substitute(paste('Size (', italic('S'), ')')),
zlab = 'Weight (kg)')
plot3d(df$X, df$Y, df$Z, type = 'l', lwd = 2, add = T, col = 'blue')
rgl.snapshot('Figure2.png')

我完全失去了轴标签。

我花时间搜索示例和文档,但找不到任何方法来更改轴标签的方向或使用斜体。这是我第一次使用 rgl 包,感谢您的帮助!

新的编辑:

感谢 user2554330 的回答,标签可以包含斜体,但标签仍然远离轴。以下两个代码都可以工作并生成此图形(我可以在交互式窗口中旋转图形,但所有标签都不会与每个轴对齐)。

plot3d(df$X, df$Y, df$Z, type = 'n', box = F, add = F,
xlab = expression(paste('Number of cars (', italic('N'), ')')),
ylab = expression(paste('Size (', italic('S'), ')')),
zlab = 'Weight (kg)')
plot3d(df$X, df$Y, df$Z, type = 'l', lwd = 2, add = T, col = 'blue')
rgl.snapshot('Figure3.png')

plot3d(df$X, df$Y, df$Z, type = 'n', box = F, add = F,
xlab = as.expression(substitute(paste('Number of cars (', italic('N'), ')'))),
ylab = as.expression(substitute(paste('Size (', italic('S'), ')'))),
zlab = 'Weight (kg)')
plot3d(df$X, df$Y, df$Z, type = 'l', lwd = 2, add = T, col = 'blue')
rgl.snapshot('Figure3.png')

如果我也可以使所有三个轴在其中一个角处从 0 开始,那将是理想的,但同样,我无法通过旋转图形来实现。

【问题讨论】:

  • 可能会将文本转换为精灵。然后它可以旋转,但也会在您放大和缩小时缩放(这可能是您不想要的)。
  • 相关且可能有用:stackoverflow.com/a/39357619/2761575
  • 感谢@dww 的帖子。我确实搜索了类似的示例,但没有看到这个,虽然我不够精明,无法解码代码示例...

标签: r special-characters axis-labels rgl


【解决方案1】:

问题是您没有为标签使用字符或表达式向量。您需要使用expression(),因为substitute() 会生成一个语言对象(它是表达式向量的一个元素)。 (使用您的原始代码,我收到错误Error in rep(text, len = newlen) : attempt to replicate an object of type 'language' 不要忽略错误消息!)

例如,

plot3d(df$X, df$Y, df$Z, type = 'n', box = F, add = F,
   xlab = expression(paste('Number of cars (', italic('N'), ')')),
   ylab = expression(paste('Size (', italic('S'), ')')),
   zlab = 'Weight (kg)')

如果你真的需要使用substitute(例如在标签中放一个值),那么将它包装在as.expression()中。

【讨论】:

  • 谢谢@user2554330,现在我可以在标签中使用斜体了!我花了很多时间寻找解决方案。我确实看到了错误消息,但问题是我无法理解它的含义。 R 经常给我非直觉的错误,我曾认为这是其中之一。我更新了我的帖子,反映了这一点,但我仍然无法弄清楚标签与轴的对齐方式。
  • rgl 中的文本始终是水平的。
  • 所以没有办法在rgl中添加与轴平行定位的文本或轴标签?
  • 如果它只是一个印有文字的矩形,您可以将其放置在您喜欢的任何位置,但很难让它看起来很好(这就是 rgl 甚至不尝试的原因)。
  • 我希望至少当您将图形固定在要保存的角度时,您可以在所需的 (x, y, Z) 位置添加文本,但我想这是不可能的.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
相关资源
最近更新 更多