在 R 中翻转绘图中的 X 和 Y 值(同时更改数据轴)。

4
我该如何在R中制作图表,使得变量的值沿着X轴显示,而变量名称则垂直地沿着Y轴显示?最终,图表应该是垂直的,Y轴上带有变量名称,X轴上带有其值。
下面的代码看起来能够实现这个目的,但问题在于实际的图表数值并没有随着轴的翻转而改变。也就是说,图表仍然按照变量名沿X轴,值沿Y轴构建。
以下是需要用到的变量:
value = 一个包含数字的列向量
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 )

谢谢!


我承认我完全不知道你在描述什么。你能提供一张你想要输出的图片吗? - joran
抱歉我的描述不够清晰。这里有一个更复杂的例子(我只想让我的坐标轴看起来像这样):http://addictedtor.free.fr/graphiques/RGraphGallery.php?graph=114 - Captain Murphy
在上面的链接中,请注意名称在 Y 轴上,值沿着 X 轴。这就是我想要做的所有事情——在 Y 轴上绘制名称,在 X 轴上绘制值——我的代码将名称放在 Y 轴上,将值放在 X 轴上(在第三行代码中),但实际图中的点被绘制为名称仍然沿着 X 轴,而值仍然沿着 Y 轴。您明白我的意思吗?我只想翻转 X 和 Y 轴,并让数据随之翻转。 - Captain Murphy
3个回答

7

一旦您使用“plot”基础函数,用户坐标就是固定的。这就像用墨水写字一样。不能通过调用axis来翻转它们。那种体操需要更面向对象的方法,例如lattice或ggplot系统。它们允许创建可以更新或修改的对象。如果您有一个ggplot对象,您可以执行以下操作:

 p + coord_flip()

2
+1 -- ggplot图形模型的优雅之处再好不过了。 - Josh O'Brien

5

为了方便灵活,我喜欢使用 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)

如果需要的话,你也可以使用基础图形绘制这个图表,不过你需要在轴标签上花一些功夫:
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设置为后期添加,以便它看起来不像框?再次感谢! - Captain Murphy
1
当然。您需要将“name”设置为因子,并手动设置其级别(它们默认按字母顺序排列)。要查看我所说的,请尝试factor(df$name),然后使用df$name <- factor(df$name, levels=c("b", "a", "c"))重新设置级别并重新绘制图形。然后查看?factor,如果它看起来令人困惑,您可以通过查看此帖子了解情况:https://dev59.com/ymw05IYBdhLWcg3wnjLC - Josh O'Brien
手动设置级别,这是否意味着设置的顺序必须与递增顺序匹配?因此,在您的示例中,b是最小的,a是第二小的,c是最大的。正确吗? - Captain Murphy
没事了,已经解决了!最后一个问题,然后我就不打扰你了——有没有办法去掉图表周围的框,并像我原来的帖子一样手动添加坐标轴?这样只会显示Y和X轴。 - Captain Murphy
1
没错,虽然我更倾向于把b看作“一级”,a看作“二级”,依此类推。在这种情况下,我们实际上只是告诉R我们希望绘制级别的顺序——而不是哪个级别“较小”或“较大”。 - Josh O'Brien
显示剩余2条评论

4

您刚刚得到了两个关于使用其他绘图库的不错建议。我认为您实际的问题是,您只传递了一个值向量给 plot 函数,而您希望它作为 x 值使用。但是当传递一个向量时,plot 函数会认为您已经给出了 y 值。您只需要像这样做:

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

并且你应该能够得到你想要的。

是的,鉴于没有轴,这就是需要的所有更改。这是对问题最直接的回答。 - John
谢谢,我很感激。我尝试了这种方法,它确实有效,谢谢!不幸的是,由于我的数据,布局看起来有点奇怪,所以我选择使用lattice包的xyplot。但你是正确的——这直接回答了我的问题,而且这正是我自己试图解决几个小时的问题... - Captain Murphy
@CaptainMurphy 没问题!lattice确实非常好! - joran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接