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