Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.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 - Fatal编程技术网

R 重新排列字符类数据帧列和绘图

R 重新排列字符类数据帧列和绘图,r,ggplot2,R,Ggplot2,我有一个如下所示的数据框: df <- data.frame(date.time = c("Fri 00:00", "Fri 23:30", "Mon 00:00", "Mon 23:30", "Sat 00:00", "Sat 23:30", "Sun 00:00", "Sun 23:30", "Thu 00:00", "Thu 23:30", "Tue 00:

我有一个如下所示的数据框:

df <- data.frame(date.time = c("Fri 00:00", "Fri 23:30", "Mon 00:00", "Mon 23:30", 
                               "Sat 00:00", "Sat 23:30", "Sun 00:00", "Sun 23:30", 
                               "Thu 00:00", "Thu 23:30", "Tue 00:00", "Tue 23:30", 
                               "Wed 00:00", "Wed 23:30"), 
                 Price = c(36.15368, 41.61206, 30.80412, 37.47360, 38.04516, 35.72798, 
                           33.05613, 32.65447, 35.50335, 41.81241, 35.14006, 37.56432, 
                           35.04553, 38.00721))
my.order <- c(7,8,3,4,11,12,13,14,9,10,1,2,5,6)
reorder(df$date.time, my.order)
但我最终得到一个奇怪的顺序,从原始数据帧的“Tue”行开始。我做错了什么

我还想标记x轴,因此我尝试了以下代码:

my.order <- c(7,8,3,4,11,12,13,14,9,10,1,2,5,6)
df %>% 
  ggplot(aes(x = reorder(date.time, my.order), y = Price, group = 1)) + 
  geom_line()
df %>% 
  ggplot(aes(x = reorder(date.time, my.order), y = Price, group = 1)) + 
  geom_line() + 
  scale_x_discrete(name = 'Day', breaks = df$date.time[c(1,3,5,7,9,11,13)], 
                   labels = c("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"))
但是,标签以原始数据集的顺序结束,而绘图的顺序从“Tue”开始,如上所述。如何使数据和标签按我希望的顺序显示

编辑:我认为这可能与水平有关。运行以下代码

df$date.time[c(7,8,3,4,11,12,13,14,9,10,1,2,5,6)]
结果如下所示:

[1] Sun 00:00 Sun 23:30 Mon 00:00 Mon 23:30 Tue 00:00 Tue 23:30 Wed 00:00 Wed 23:30
[9] Thu 00:00 Thu 23:30 Fri 00:00 Fri 23:30 Sat 00:00 Sat 23:30
14 Levels: Tue 00:00 Tue 23:30 Mon 00:00 Mon 23:30 Wed 00:00 Wed 23:30 ... Sun 23:30

不知道为什么。

要让星期天首先出现,请执行以下操作:

 df$date.time <- reorder(df$date.time, my.order)
 df %>% 
   ggplot(aes(x = as.character(date.time), y = Price, group = 1)) + 
   geom_line()

要首先显示星期日,请执行以下操作:

 df$date.time <- reorder(df$date.time, my.order)
 df %>% 
   ggplot(aes(x = as.character(date.time), y = Price, group = 1)) + 
   geom_line()

在问题的第一部分,您的代码实际上执行了您要求它执行的操作:根据数据在
df
中的顺序,您将位置
1
2
分配给两个
Tue
值,这就是
ggplot2
首先绘制它们的原因

运行以下命令时,可以看到与每个元素关联的编号:

df <- data.frame(date.time = c("Fri 00:00", "Fri 23:30", "Mon 00:00", "Mon 23:30", 
                               "Sat 00:00", "Sat 23:30", "Sun 00:00", "Sun 23:30", 
                               "Thu 00:00", "Thu 23:30", "Tue 00:00", "Tue 23:30", 
                               "Wed 00:00", "Wed 23:30"), 
                 Price = c(36.15368, 41.61206, 30.80412, 37.47360, 38.04516, 35.72798, 
                           33.05613, 32.65447, 35.50335, 41.81241, 35.14006, 37.56432, 
                           35.04553, 38.00721))
my.order <- c(7,8,3,4,11,12,13,14,9,10,1,2,5,6)
reorder(df$date.time, my.order)
方法
df$date.time[c(7,8,3,4,11,12,13,14,9,10,1,2,5,6)]
的区别在于,在第一个重新排序方法中,您将一个位置与向量的每个元素关联起来(即第一个元素有位置7,第二个元素有位置8,等等),在方括号方法中,定义向量中元素的排列顺序(即第7个元素排在第一位,第8个元素排在第二位,等等)

您会发现在
ggplot
调用中使用方括号方法没有帮助,因为
ggplot2
默认情况下会自动使用字母顺序,即数据帧中数据的顺序无关紧要(数据是字符串或因子不会产生任何差异)

但是,如果使用因子(这是使用
data.frame()
函数存储字符串时的默认值),则可以对其级别进行排序

df$date.time <- ordered(df$date.time,
                        levels = df$date.time[c(7,8,3,4,11,12,13,14,9,10,1,2,5,6)])
# see the new ordered levels
levels(df$date.time)
# visualise as is, ggplot2 uses ordered levels
df %>% 
  ggplot(aes(x = date.time, y = Price, group = 1)) + 
  geom_line()

在问题的第一部分,您的代码实际上执行了您要求它执行的操作:根据数据在
df
中的顺序,您将位置
1
2
分配给两个
Tue
值,这就是
ggplot2
首先绘制它们的原因

运行以下命令时,可以看到与每个元素关联的编号:

df <- data.frame(date.time = c("Fri 00:00", "Fri 23:30", "Mon 00:00", "Mon 23:30", 
                               "Sat 00:00", "Sat 23:30", "Sun 00:00", "Sun 23:30", 
                               "Thu 00:00", "Thu 23:30", "Tue 00:00", "Tue 23:30", 
                               "Wed 00:00", "Wed 23:30"), 
                 Price = c(36.15368, 41.61206, 30.80412, 37.47360, 38.04516, 35.72798, 
                           33.05613, 32.65447, 35.50335, 41.81241, 35.14006, 37.56432, 
                           35.04553, 38.00721))
my.order <- c(7,8,3,4,11,12,13,14,9,10,1,2,5,6)
reorder(df$date.time, my.order)
方法
df$date.time[c(7,8,3,4,11,12,13,14,9,10,1,2,5,6)]
的区别在于,在第一个重新排序方法中,您将一个位置与向量的每个元素关联起来(即第一个元素有位置7,第二个元素有位置8,等等),在方括号方法中,定义向量中元素的排列顺序(即第7个元素排在第一位,第8个元素排在第二位,等等)

您会发现在
ggplot
调用中使用方括号方法没有帮助,因为
ggplot2
默认情况下会自动使用字母顺序,即数据帧中数据的顺序无关紧要(数据是字符串或因子不会产生任何差异)

但是,如果使用因子(这是使用
data.frame()
函数存储字符串时的默认值),则可以对其级别进行排序

df$date.time <- ordered(df$date.time,
                        levels = df$date.time[c(7,8,3,4,11,12,13,14,9,10,1,2,5,6)])
# see the new ordered levels
levels(df$date.time)
# visualise as is, ggplot2 uses ordered levels
df %>% 
  ggplot(aes(x = date.time, y = Price, group = 1)) + 
  geom_line()

谢谢该重新排序不会更改我的
数据.frame
。更改它的是as.character位,而不是重新排序是的,我已经尝试了您编写的代码,使用
日期.time
列的
重新排序
,然后是
ggplot
中的
as.character
,但是
数据.frame
,结果图,没有重新排序。奇怪,对我有用…你使用的是最新的R吗?我使用的是RStudio版本0.99.902。该重新排序不会更改我的
数据.frame
。更改它的是as.character位,而不是重新排序是的,我已经尝试了您编写的代码,使用
日期.time
列的
重新排序
,然后是
ggplot
中的
as.character
,但是
数据.frame
,结果图,没有重新排序。奇怪,对我有用…你用的是最新的R吗?我用的是RStudio版本0.99.902