【问题标题】:Linetype based on list基于列表的线型
【发布时间】:2012-04-03 04:20:56
【问题描述】:

我有一份清单和一些数据

l <- c('b', 'a')
frame <- data.frame(series = rep(c('a', 'b'), 6), x = c(1:12), y = c(1:12))

我想通过

绘制一条平滑线
ggplot(frame, data) + geom_smooth(linetype=series)

但我需要基于列表llinetype,列表l 中的第一个元素应该是 正常,列表的第二个元素加点。我试过了

ggplot(frame, data) + geom_smooth() + scale_linetype_manual("", values=series, breaks=l) 

但这并不适用任何线型。

【问题讨论】:

  • 请注意,frame 的定义应该在 data.frame 调用中使用 = 而不是 &lt;-。此外,您的示例似乎不起作用; ggplot(frame,data)+geom_smooth() 抱怨 data 没有被包裹到 aes 中;并且您需要在aes 中同时指定xy

标签: r ggplot2


【解决方案1】:

您的示例数据有点奇怪,因为您有一个分组变量(系列)和一个数值列(数据),但听起来您想绘制两个变量。以下是一些可能更相关的示例数据:

frame <- data.frame(series = rep(c('a','b'),6),x = runif(12),y = runif(12))

注意使用= 而不是&lt;-。你有没有注意到你的数据框的列名丑得难以形容? ;) 另请注意,我没有使用 data 这个词,因为它被用作函数,并且经常用作参数,因此会让人感到困惑。

然后你可以像这样绘制两条线:

ggplot(frame,aes(x = x,y = y)) + 
    geom_line(aes(linetype = series,group = series))

或两条这样的平滑线(由于数据量小而引发大量警告):

ggplot(frame,aes(x = x,y = y)) + 
    geom_smooth(aes(linetype = series,group = series))

这里的关键是您传递 ggplot 一个数据框 (frame),然后使用 aes() 函数将变量映射到美学。在这种情况下,我们将 x,y 值映射到 x,y 变量,并将线型映射到系列。但是我们必须告诉 ggplot 如何对数据进行分组,因此使用了分组美学。

美学可以映射到ggplot,在这种情况下它们会延续到后续的geom,或者它们可以只映射到使用它们的geom中。

最后,要指定要使用的线型,您尝试scale_linetype_manual 是正确的:

+ scale_linetype_manual(values = 2:3)

您将要使用的线型传递给values 参数。在规模。您还可以将命名向量传递给values,因此指定哪些级别获得哪些线型:

+ scale_linetype_manual(values = c('a' = 2,'b' = 3))

【讨论】:

  • 我如何告诉ggplot 使用哪个线型来对应series 的哪个值?
  • 这就是你正确的部分——使用scale_linetype_manual
  • 我从中生成了 4 个图,具有不同的系列名称(不按字母顺序对应),所以我有 currentprev 在列表 l 中,我'想根据l分配线型。
  • @Tass 我不明白。你有什么问题?
  • 如何在frame$series == "a" #=&gt; straight lineframe$series == "b" #=&gt; dotted line 中进行映射?
猜你喜欢
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-01
相关资源
最近更新 更多