【问题标题】:Flipping the X and Y values in a plot in R (with the data changing axes as well)在 R 的图中翻转 X 和 Y 值(数据也改变轴)
【发布时间】:2011-11-14 22:51:52
【问题描述】:

如何在 R 中绘制图表,以便变量的值沿 X 轴显示,而变量名称沿 Y 轴垂直显示?最终,绘图应该看起来是垂直的,变量名称在 Y 轴上,变量值在 X 轴上。

下面的代码表面上会这样做,但问题是实际绘图值不会随轴翻转。意思是,绘图仍然像名称沿 X 轴而值沿 Y 轴一样构造。

以下变量:

值 = 数字的列向量

name = 对应每个数字的一​​列名称

plot(value, axes=F, xlab="", ylab= "", type= "b", xlim=c(-5, 50), ylim=c(0, 8))
axis(1)
axis(2, at = 1:length(name), labels = name, las=1, pos=-3.0,cex.axis=.65 )

谢谢!

【问题讨论】:

  • 我承认我完全不知道你可能在描述什么。你能提供一张你希望你的输出看起来像什么的图片吗?
  • 对不起我的描述。这是一个更复杂的例子(我只是想让我的坐标轴看起来像这样):addictedtor.free.fr/graphiques/RGraphGallery.php?graph=114
  • 在上面的链接中,请注意名称在 Y 轴上的位置以及值在 X 轴上的位置。这就是我想做的——在 Y 上绘制名称,在 X 上绘制值——以及我上面的代码,将名称放在 Y 轴上,将值放在 X 轴上(在代码的第三行中),但是绘图中的实际点被绘制成好像名称仍沿 X 轴而值仍在 Y 轴上。那有意义吗?我只想翻转 X 和 Y 轴并让数据随之翻转。

标签: r plot


【解决方案1】:

一旦您使用“绘图”基本函数,用户坐标就固定了。这就像用墨水书写。以后不可能通过调用轴来翻转它们。这种体操需要更面向对象的方法,例如 lattice 或 ggplot 系统。它们允许创建可以更新或修改的对象。如果你有一个 ggplot 对象,你可以这样做:

 p + coord_flip()

【讨论】:

  • +1 -- 没有比 ggplot 图形模型优雅的更好的例子了。
【解决方案2】:

为了在这方面轻松灵活,我喜欢 lattice 包中的绘图功能:

 library(lattice)

 # First make some example data
 df <- data.frame(name=rep(c("a", "b", "c"), each=5), value=rnorm(15))

 # Then try plotting it in both 'orientations'
 # ... as a dotplot
 xyplot(value~name, data=df)
 xyplot(name~value, data=df)

 # ... or perhaps as a 'box-and-whisker' plot
 bwplot(value~name, data=df)
 bwplot(name~value, data=df)

如果需要,您也可以使用 base graphics 绘制此图,但您必须在轴标签上做一些工作:

plot(x=df$value, y=df$name, yaxt="n",
     xlab="value", ylab="name")
axis(2, at=1:3, labels=levels(df$name), las=1)

【讨论】:

  • 这太好了,谢谢!您是否知道一种对数据进行排序以使值减少或增加的方法?喜欢代码sort(value, decreasing=F),但在情节中?默认情况下,xyplot 似乎按字母顺序排序。此外,是否可以执行 axes=F 并稍后添加它们以使其看起来不像一个盒子?再次感谢!
  • 当然。您需要将name 设为一个因子,并手动设置其levels(默认为字母顺序)。要查看我在说什么,请尝试factor(df$name),然后使用df$name &lt;- factor(df$name, levels=c("b", "a", "c")) 重置级别并重新绘制图形。然后看看?factor,如果它看起来令人困惑,看看这篇文章你就会知道你有同伴:stackoverflow.com/questions/7128413/…
  • 手动设置关卡,是否意味着设置的顺序必须与递增的顺序相匹配?所以在你的例子中,b 是最小的,a 是第二小的,c 是最大的。对吗?
  • 没关系。得到它的工作!最后一个问题,那我就不打扰你了——有什么方法可以摆脱图表周围的框并像我原来的帖子一样手动添加轴?这样,只显示 Y 轴和 X 轴。
  • 没错,虽然我倾向于将 b 视为“1 级”,将 a 视为“2 级”,依此类推。在这种情况下,我们实际上只是告诉R 我们想要绘制级别的顺序——而不是哪个“更小”或“更大”。
【解决方案3】:

您刚刚得到了关于使用其他绘图库的两个不错的建议。我相信您的实际问题是您只将一个值向量传递给您打算用作x 值的plot。但是当传递一个向量时,plot 假设你已经给了它y 值。只需执行以下操作:

plot(x = value, y = 1:length(name),...)

你应该得到你想要的。

【讨论】:

  • 是的,因为没有轴是所有需要的更改。这是对这个问题最直接的回答。
  • 谢谢,非常感谢。我试过这个方法,它确实有效,谢谢!不幸的是,考虑到我的数据,布局看起来有点奇怪,所以我将使用 lattice 包 xyplot。但你是对的——这确实直接回答了我的问题,而这正是我数小时试图自己弄清楚的……
  • @CaptainMurphy 没问题! lattice确实很不错!
猜你喜欢
  • 2013-08-16
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
  • 1970-01-01
  • 2013-02-24
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
相关资源
最近更新 更多