Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 创建变量对的清晰可分辨线图_R_Ggplot2_Dplyr_Tidyr - Fatal编程技术网

R 创建变量对的清晰可分辨线图

R 创建变量对的清晰可分辨线图,r,ggplot2,dplyr,tidyr,R,Ggplot2,Dplyr,Tidyr,我有以下数据帧: library(dplyr) library(tidyr) library(ggplot2) foobar <- structure(list(month = structure(c(1477872000, 1480464000, 1483142400, 1485820800, 1488240000, 1490918400, 1493510400, 1496188800, 1498780800, 1501459200, 1504137600, 1506729600,

我有以下数据帧:

library(dplyr)
library(tidyr)
library(ggplot2)

foobar <- structure(list(month = structure(c(1477872000, 1480464000, 1483142400, 
1485820800, 1488240000, 1490918400, 1493510400, 1496188800, 1498780800, 
1501459200, 1504137600, 1506729600, 1509408000, 1.512e+09, 1514678400, 
1517356800, 1519776000, 1522454400, 1525046400, 1527724800, 1530316800
), class = c("POSIXct", "POSIXt"), tzone = "UTC"), r = c(283L, 
298L, 277L, 231L, 276L, 323L, 242L, 255L, 208L, 289L, 284L, 263L, 
280L, 278L, 269L, 288L, 255L, 324L, 339L, 355L, 300L), r_unanswered = c(133L, 
139L, 106L, 85L, 132L, 141L, 89L, 110L, 80L, 142L, 174L, 159L, 
146L, 162L, 153L, 161L, 142L, 174L, 211L, 208L, 194L), regression = c(260L, 
278L, 249L, 242L, 301L, 349L, 249L, 309L, 256L, 280L, 326L, 276L, 
299L, 322L, 235L, 281L, 256L, 293L, 356L, 307L, 279L), regression_unanswered = c(102L, 
119L, 92L, 107L, 119L, 126L, 108L, 132L, 89L, 141L, 199L, 148L, 
161L, 160L, 125L, 159L, 137L, 139L, 208L, 177L, 162L), machine_learning = c(208L, 
190L, 176L, 208L, 221L, 265L, 204L, 215L, 251L, 283L, 314L, 257L, 
250L, 290L, 240L, 290L, 275L, 295L, 292L, 316L, 324L), machine_learning_unanswered = c(64L, 
67L, 62L, 86L, 78L, 76L, 67L, 67L, 90L, 128L, 155L, 106L, 125L, 
132L, 125L, 143L, 132L, 159L, 159L, 158L, 191L)), row.names = c(NA, 
-21L), class = c("tbl_df", "tbl", "data.frame"))
> glimpse(foobar)
Observations: 21
Variables: 7
$ month                       <dttm> 2016-10-31, 2016-11-30, 2016-12-31, 2...
$ r                           <int> 283, 298, 277, 231, 276, 323, 242, 255...
$ r_unanswered                <int> 133, 139, 106, 85, 132, 141, 89, 110, ...
$ regression                  <int> 260, 278, 249, 242, 301, 349, 249, 309...
$ regression_unanswered       <int> 102, 119, 92, 107, 119, 126, 108, 132,...
$ machine_learning            <int> 208, 190, 176, 208, 221, 265, 204, 215...
$ machine_learning_unanswered <int> 64, 67, 62, 86, 78, 76, 67, 67, 90, 12...
但这不起作用:每双鞋的颜色不一样,因此我无法实现目标1(每双鞋必须很容易与其他鞋区分)


我会将所有列收集成一个长格式,然后根据这些列名创建变量,以映射到
颜色
线型
。您可以使用
tidyr::separate()
完成后一项任务

我发现您的特殊情况有点困难,因为有些标记名包含下划线,而不是直接在“unanswered”之前的下划线。因此,我首先将
“\u unanswered”
替换为
“.unanswered”
,这样我就可以在句点而不是下划线上分隔“tag”。这将创建两个新列,一个用于颜色(基于标记名),另一个用于线型(基于已应答与未应答)。已回答的问题没有信息表明它们已被回答,因此我添加了一个
ifelse()
语句

以下是数据操作:

foolong = foobar %>%
    gather(tag, count, -month) %>%
    mutate(tag = sub("_unanswered", ".unanswered", tag)) %>%
    separate(tag, into = c("name", "answered"), sep = "\\.", 
             remove = FALSE, fill = "right") %>%
    mutate(answered = ifelse(!is.na(answered), "unanswered", "answered"))
然后,可以通过将颜色和线型映射到新变量来绘制绘图

ggplot(foolong, aes(x = month, y = count, 
                    color = name) +
    geom_line( aes(linetype = answered))

您可以根据需要删除或更改图例,以符合您的目的

通过分离()进行拆分的更为复杂的方法。

正如@Henrik所指出的,您可以通过regex使用look-ahead,只在单词“unanswered”前面的下划线上进行拆分。这避免了我在
sub()
上的工作,并节省了一个步骤

代码的这一部分看起来像:

foobar %>%
     gather(tag, count, -month) %>%
     separate(tag, into = c("name", "answered"), sep = "_(?=[unanswered])", 
              remove = FALSE, fill = "right")

为此,我会将所有列收集成一个长格式,然后基于这些列名创建变量,以映射到
color
linetype
。您可以使用
tidyr::separate()
完成后一项任务

我发现您的特殊情况有点困难,因为有些标记名包含下划线,而不是直接在“unanswered”之前的下划线。因此,我首先将
“\u unanswered”
替换为
“.unanswered”
,这样我就可以在句点而不是下划线上分隔“tag”。这将创建两个新列,一个用于颜色(基于标记名),另一个用于线型(基于已应答与未应答)。已回答的问题没有信息表明它们已被回答,因此我添加了一个
ifelse()
语句

以下是数据操作:

foolong = foobar %>%
    gather(tag, count, -month) %>%
    mutate(tag = sub("_unanswered", ".unanswered", tag)) %>%
    separate(tag, into = c("name", "answered"), sep = "\\.", 
             remove = FALSE, fill = "right") %>%
    mutate(answered = ifelse(!is.na(answered), "unanswered", "answered"))
然后,可以通过将颜色和线型映射到新变量来绘制绘图

ggplot(foolong, aes(x = month, y = count, 
                    color = name) +
    geom_line( aes(linetype = answered))

您可以根据需要删除或更改图例,以符合您的目的

通过分离()进行拆分的更为复杂的方法。

正如@Henrik所指出的,您可以通过regex使用look-ahead,只在单词“unanswered”前面的下划线上进行拆分。这避免了我在
sub()
上的工作,并节省了一个步骤

代码的这一部分看起来像:

foobar %>%
     gather(tag, count, -month) %>%
     separate(tag, into = c("name", "answered"), sep = "_(?=[unanswered])", 
              remove = FALSE, fill = "right")

为了节省一些输入,您可以使用
separate
中的前瞻功能:
separate(tag,into=c(“name”,“answered”),sep=“(?=[unanswered])”,fill=“right”)
…并使用
replace
,而不是
ifelse
mutate(answered=replace(answered,is.na(answered),“answered”)
。我认为不需要
aes
ggplot(愚弄,aes(x=month,y=count,color=name,linetype=responsed))+geom\u line()
。干杯,但“回答的问题没有信息表明他们得到了回答[…]”这是因为它们不是回答的问题,而是全部问题,即回答+未回答(您可能已经注意到数据框名称:
tall\u unanswered
tall\u total
,而不是
tall\u answered
)。无论如何,我可以很容易地解决这个问题。你有没有可能美化一下传说?也许让它占用更少的整体图片空间,或者把它放在绘图画布中;-)我知道这不是原始问题的一部分,但对像你这样的专家来说应该很容易…@DeltaIV Look-ahead是一个正则表达式术语。请搜索regex教程,例如@DeltaIV您可以将图例移动到绘图的内部或另一侧,或者使用
主题()
元素
图例。位置
图例。方向
,将图例水平放置,而不是重复更聪明的人已经编写的内容。如果您在使用legend时遇到特殊问题,我建议您提出一个新问题。@Henrik很棒!我知道有一种合乎逻辑的方法来分割昨晚我没有想到的变量。我一直专注于拆分“最后一个”下划线并遇到问题,而不是考虑使用“unanswered”前面的下划线。为了节省一些输入,您可以使用
separate
separate(tag,into=c(“name”,“answered”),sep=“(?=[unanswered]),fill=“right”)
…并使用
替换
而不是
ifelse
mutate(responsed=replace(responsed,is.na(responsed),“responsed”)
。我认为不需要
aes
ggplot(愚弄,aes(x=month,y=count,color=name,linetype=responsed))+geom\u line()
。干杯,但“回答的问题没有信息表明他们得到了回答[…]”这是因为它们不是回答的问题,而是全部问题,即回答+未回答(您可能已经注意到数据框名称:
tall\u unanswered
tall\u total
,而不是
tall\u answered
)。无论如何,我可以很容易地解决这个问题。你有没有可能美化一下传说?也许让它占用更少的整体图片空间,或者把它放在绘图画布中;-)我知道这不是原始问题的一部分,但对像你这样的专家来说应该很容易…@DeltaIV Look-ahead是一个正则表达式术语。我不再重复聪明人已经写过的东西,请搜索regex教程,e