[英]Plot multiple lines (data series) with unique colors and custom x_axis in R
我正在嘗試在 R 中生成一個 plot ,它有多行(每行代表一個不同的類別),每行都有唯一的 colors。 x 軸是時間,從 17:00 開始,到次日 9:00 結束。 y 軸是每個類別在特定時間的頻率(即計數數)。 請查看我用於 plot 的 csv 文件:
Time,-3,-2.5,-2,-1.5,-1,-0.5,0,0.5,1,1.5,2,2.5,3
0,0,0,0,0,0,0,288,224,148,78,37,23,19
1,0,0,0,0,0,0,321,208,128,74,55,20,11
2,0,0,0,0,0,0,326,212,128,80,46,20,5
3,0,0,0,0,0,0,345,209,131,73,36,17,6
4,0,0,0,0,0,0,364,201,117,77,38,15,5
5,0,0,0,0,0,0,390,205,100,73,36,10,3
6,0,0,0,0,0,0,406,196,121,57,24,8,5
7,0,0,0,0,0,1,560,161,62,25,5,3,0
8,0,0,0,0,0,18,772,22,5,0,0,0,0
9,0,0,0,0,18,130,667,1,0,1,0,0,0
10,0,0,0,2,55,256,503,1,0,0,0,0,0
11,1,0,0,7,106,349,354,0,0,0,0,0,0
12,1,1,0,12,184,368,251,0,0,0,0,0,0
13,0,0,0,32,228,357,200,0,0,0,0,0,0
14,0,0,0,51,245,314,208,0,0,0,0,0,0
15,0,0,0,51,232,317,218,0,0,0,0,0,0
16,0,0,0,37,224,338,218,1,0,0,0,0,0
17,0,0,0,21,156,350,290,1,0,0,0,0,0
18,0,0,0,2,72,351,392,1,0,0,0,0,0
19,0,0,0,0,15,207,587,9,0,0,0,0,0
20,0,0,0,0,1,33,748,34,2,0,0,0,0
21,0,0,0,0,0,3,609,137,51,12,4,1,1
22,0,0,0,0,0,0,325,241,133,71,31,11,6
23,0,0,0,0,0,0,272,227,149,82,50,21,17
除了時間列之外,每一列代表一個類別(即-3、-2.5、-2 等...)。 在時間 0,類別 -3 出現 0 次,類別 3 出現 19 次,依此類推。 我希望我的線條代表類別並在圖表上顯示每個類別隨時間變化的頻率(類似於這個問題,但不僅僅是犯罪Freq,我在這里有多個類別。
另外兩件事是:
我已經嘗試了上面的解決方案和這個問題的解決方案,但未能成功。 我的一些嘗試是:
嘗試1:
df = read.csv("data_summary.csv")
// Taking the rows in the order of time that I want (i.e. from 17:00 to 9:00)
row_to_take = c(18,19,20,21,22,23, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
// Tring to plot it with x-axis in desired order
matplot(x = df$Time[row_to_take], y = df[row_to_take, 9:14], ylab = "Frequency", xlab = "Hour", type = c("b"), pch=3, col = 1:7, xaxt="n" )
axis(1, at = c(17, 18, 19, 20, 21, 22, 23, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9), las=0)
legend("topleft", legend = 1:7, col=1:7, pch=3)
但是,此嘗試不會生成正確的圖形(不正確的 x 軸和由黑色表示的類別被繪制了兩次)
我的第二次嘗試:
ggplot(df, aes(Time)) + geom_line(aes(y = 0, colour = "0")) +
geom_line(aes(y = 0.5, colour = "0.5")) + geom_line(aes(y = 1, colour = "1"))+
geom_line(aes(y = 1.5, colour = "1.5"))+ geom_line(aes(y = 2, colour = "2"))+
geom_line(aes(y = 2.5, colour = "2.5"))+ geom_line(aes(y = 3, colour = "3"))
此嘗試與第一次嘗試具有相同的問題。 另外,我不知道如何更改每種顏色的圖例名稱和軸名稱(xlab 和 ylab 不起作用??)
請建議我一個簡單的解決方案。 我是 R 的新手,對高級功能/包了解不多。 提前謝謝大家:)
您可以使用可愛的 package ggplot2
。 首先,您應該使用pivot_longer
使您的 dataframe 格式更長,然后您可以將每個類別指定為一條帶顏色的線。 您可以像這樣filter
類別:
df <- read.table(text = "Time,-3,-2.5,-2,-1.5,-1,-0.5,0,0.5,1,1.5,2,2.5,3
0,0,0,0,0,0,0,288,224,148,78,37,23,19
1,0,0,0,0,0,0,321,208,128,74,55,20,11
2,0,0,0,0,0,0,326,212,128,80,46,20,5
3,0,0,0,0,0,0,345,209,131,73,36,17,6
4,0,0,0,0,0,0,364,201,117,77,38,15,5
5,0,0,0,0,0,0,390,205,100,73,36,10,3
6,0,0,0,0,0,0,406,196,121,57,24,8,5
7,0,0,0,0,0,1,560,161,62,25,5,3,0
8,0,0,0,0,0,18,772,22,5,0,0,0,0
9,0,0,0,0,18,130,667,1,0,1,0,0,0
10,0,0,0,2,55,256,503,1,0,0,0,0,0
11,1,0,0,7,106,349,354,0,0,0,0,0,0
12,1,1,0,12,184,368,251,0,0,0,0,0,0
13,0,0,0,32,228,357,200,0,0,0,0,0,0
14,0,0,0,51,245,314,208,0,0,0,0,0,0
15,0,0,0,51,232,317,218,0,0,0,0,0,0
16,0,0,0,37,224,338,218,1,0,0,0,0,0
17,0,0,0,21,156,350,290,1,0,0,0,0,0
18,0,0,0,2,72,351,392,1,0,0,0,0,0
19,0,0,0,0,15,207,587,9,0,0,0,0,0
20,0,0,0,0,1,33,748,34,2,0,0,0,0
21,0,0,0,0,0,3,609,137,51,12,4,1,1
22,0,0,0,0,0,0,325,241,133,71,31,11,6
23,0,0,0,0,0,0,272,227,149,82,50,21,17", header = TRUE, sep = ",", check.names = FALSE)
library(dplyr)
library(ggplot2)
library(tidyr)
df %>%
pivot_longer(cols = -Time) %>%
filter(name >= 0) %>%
ggplot(aes(x = Time, y = value, colour = name)) +
geom_line() +
labs(x = "Time", y = "Value", colour = "Category")
使用reprex v2.0.2創建於 2022-08-25
反轉 x 軸值
您可以將scale_x_continuous
與“反向”一起使用:
library(dplyr)
library(ggplot2)
library(tidyr)
df %>%
pivot_longer(cols = -Time) %>%
filter(name >= 0) %>%
filter(Time >= 9 & Time <= 17) %>%
ggplot(aes(x = Time, y = value, colour = name)) +
geom_line() +
scale_x_continuous(trans = "reverse") +
labs(x = "Time", y = "Value", colour = "Category")
使用reprex v2.0.2創建於 2022-08-25
我將上面來自@Quinten 的答案和這個答案結合起來: 使用 scale_x_time 設置限制並且能夠想出這個:
df = read.csv("data_summary.csv", check.names = FALSE, header = TRUE)
df$Time <- as.POSIXct(df$Time)
df %>%
pivot_longer(cols = -Time) %>%
filter(name > 0) %>%
ggplot(aes(x=Time, y=value, color=name)) +
geom_line()+
labs(x="Time", y="Frequency", title="")+
theme_bw() +
theme(axis.text.x = element_text(angle = 90, hjust = 1,family="Times",
face="bold", size=12),
axis.text.y = element_text(family="Times", face="bold", size=12),
strip.text = element_text(size=6, face="bold")) +
scale_y_continuous(expand = expansion(mult = c(0, .1))) +
scale_x_datetime(date_labels = '%T',
limits = c(as.POSIXct('2022-08-24 22:00:00', tz = 'UTC'),
as.POSIXct('2022-08-25 14:00:00', tz = 'UTC')),
breaks = '1 hours')
這就是我需要的。 請注意,我必須將“時間”列更改為以下格式:0:00、1:00 等...以便我可以在其上使用 as.POSIXct(df$Time)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.