วิธีสร้างแผนที่ความร้อนใน r โดยใช้ ggplot2
บทช่วยสอนนี้จะอธิบายวิธีสร้างแผนที่ความร้อนใน R โดยใช้ ggplot2
ตัวอย่าง: การสร้างแผนที่ความร้อนใน R
ในการสร้างแผนที่ความร้อน เราจะใช้ชุดข้อมูล R mtcars ในตัว
#view first six rows of mtcars
head(mtcars)
# mpg cyl disp hp drat wt qsec vs am gear carb
#Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
#Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
#Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
#Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
#Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
#Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
ปัจจุบัน mtcars อยู่ในรูปแบบกว้าง แต่เราจำเป็นต้องผสมผสานมันให้เป็นรูปแบบยาวเพื่อสร้างแผนที่ความร้อน
#load reshape2 package to use melt() function library(reshape2) #melt mtcars into long format melt_mtcars <- melt(mtcars) #add column for car name melt_mtcars$car <- rep(row.names(mtcars), 11) #view first six rows of melt_mtcars head(melt_mtcars) # variable value char #1 mpg 21.0 Mazda RX4 #2 mpg 21.0 Mazda RX4 Wag #3 mpg 22.8 Datsun 710 #4 mpg 21.4 Hornet 4 Drive #5 mpg 18.7 Hornet Sportabout #6 mpg 18.1 Valiant
เราสามารถใช้โค้ดต่อไปนี้เพื่อสร้างแผนที่ความร้อนใน ggplot2:
library(ggplot2) ggplot(melt_mtcars, aes(variable, char)) + geom_tile(aes(fill = value), color = "white") + scale_fill_gradient(low = "white", high = "red")
น่าเสียดาย เนื่องจากค่า disp มีขนาดใหญ่กว่าค่าของตัวแปรอื่นๆ ทั้งหมดในกรอบข้อมูล จึงเป็นเรื่องยากที่จะเห็นการเปลี่ยนแปลงสีของตัวแปรอื่นๆ
วิธีหนึ่งในการแก้ปัญหานี้คือการปรับสเกลค่าของแต่ละตัวแปรจาก 0 เป็น 1 โดยใช้ฟังก์ชัน rescale() ในแพ็คเกจ scales() และฟังก์ชัน ddply() ในแพ็คเกจ plyr():
#load libraries library(plyr) library(scales) #rescale values for all variables in melted data frame melt_mtcars <- ddply(melt_mtcars, .(variable), transform, rescale = rescale(value)) #create heatmap using rescaled values ggplot(melt_mtcars, aes(variable, char)) + geom_tile(aes(fill = rescale), color = "white") + scale_fill_gradient(low = "white", high = "red")
นอกจากนี้เรายังสามารถเปลี่ยนสีแผนที่ความร้อนได้โดยการเปลี่ยนสีที่ใช้ในอาร์กิวเมนต์ scale_fill_gradient():
#create heatmap using blue color scale
ggplot(melt_mtcars, aes(variable, char)) +
geom_tile(aes(fill = rescale), color = "white") +
scale_fill_gradient(low = "white", high = "steelblue")
โปรดทราบว่าปัจจุบันแผนที่ความร้อนได้รับการจัดหมวดหมู่ตามชื่อรถยนต์ เราสามารถเรียงลำดับแผนที่ความร้อนตามค่าของตัวแปรตัวใดตัวหนึ่งเช่น mpg แทนได้โดยใช้โค้ดต่อไปนี้:
#define car name as a new column, then order by mpg descending mtcars$car <- row.names(mtcars) mtcars$car <- with(mtcars, reorder(car, mpg)) #melt mtcars into long format melt_mtcars <- melt(mtcars) #rescale values for all variables in melted data frame melt_mtcars <- ddply(melt_mtcars, .(variable), transform, rescale = rescale(value)) #create heatmap using rescaled values ggplot(melt_mtcars, aes(variable, char)) + geom_tile(aes(fill = rescale), color = "white") + scale_fill_gradient(low = "white", high = "steelblue")
หากต้องการจัดเรียงแผนที่ความร้อนโดยการเพิ่ม mpg เพียงใช้ -mpg ในอาร์กิวเมนต์ reorder():
#define car name as a new column, then order by mpg descending mtcars$car <- row.names(mtcars) mtcars$car <- with(mtcars, reorder(car, -mpg )) #melt mtcars into long format melt_mtcars <- melt(mtcars) #rescale values for all variables in melted data frame melt_mtcars <- ddply(melt_mtcars, .(variable), transform, rescale = rescale(value)) #create heatmap using rescaled values ggplot(melt_mtcars, aes(variable, char)) + geom_tile(aes(fill = rescale), color = "white") + scale_fill_gradient(low = "white", high = "steelblue")
สุดท้ายนี้ เราสามารถลบป้ายกำกับแกน x และ y รวมถึงคำอธิบายแผนภูมิได้ หากเราไม่ชอบรูปลักษณ์ของมันโดยใช้อาร์กิวเมนต์ labs() และ theme():
#create heatmap with no axis labels or legend ggplot(melt_mtcars, aes(variable, char)) + geom_tile(aes(fill = rescale), color = "white") + scale_fill_gradient(low = "white", high = "steelblue") + labs(x = "", y = "") + theme(legend.position = "none")