ggplot2 翻转因子标签
ggplot2 flipping factor labels
我还没有深入探讨这个问题。我有一个使用 ggplot2 的多面条形图并正在寻找一种方法:
1) 让它显示我的问卷参与者没有选择的类别(例如,如果类别 5 ("Horrible") 从未被选择过,我仍然希望它显示在图表中(没有条)以显示完整的可能答案集并使图表更易于阅读)。
2) 我想翻转多面图中的 Y 轴,使 "Great" 在顶部,"Horrible" 在底部。有没有办法在不更改数据的情况下做到这一点?
随函附上我目前拥有的完整、独立的小型示例。我仍然是 R-Newbee,所以如果你有关于如何使这个更短更简单的建议(我相信有很多可以减少),我很高兴听到你的建议。
data.csv:
ONE;TWO;THREE;FOUR
1;1;2;1
1;2;3;2
2;2;3;2
3;2;4;3
code.R
library(ggplot2)
library(scales)
df = read.csv2("data.csv", fileEncoding="UTF-8")
df[df=="0"]<-NA;
df[df=="1"]<-"Great";
df[df=="2"]<-"Good";
df[df=="3"]<-"OK";
df[df=="4"]<-"Not Good";
df[df=="5"]<-"Horrible";
# four entries
df$ID = c(1:4);
# turn to factors
df$ONE = factor(df$ONE, levels = c("NA", "Great", "Good", "OK", "Not Good", "Horrible"));
df$TWO = factor(df$TWO, levels = c("NA", "Great", "Good", "OK", "Not Good", "Horrible"));
df$THREE = factor(df$THREE, levels = c("NA", "Great", "Good", "OK", "Not Good", "Horrible"));
df$FOUR = factor(df$FOUR, levels = c("NA", "Great", "Good", "OK", "Not Good", "Horrible"));
df.molten <- melt(df, id.vars="ID");
df.molten$value <- factor( df.molten$value, levels = c("NA", "Great", "Good", "OK", "Not Good", "Horrible") );
ggplot( df.molten , aes( x = value, fill=value ) ) +
geom_bar(aes(y = (..count..)/8)) +
theme(axis.text.x = element_text(angle = 45, hjust = 1, face=2),
legend.position="none",
axis.text= element_text(size=12),
axis.title=element_text(size=14,face="bold"),
panel.background = element_rect(fill = "white")) +
scale_fill_manual(values=c("blue4","steelblue2", "blue4","steelblue2", "blue4")) +
facet_wrap( "variable" ) +
scale_y_continuous(breaks=seq(0, 1, 0.1), labels = percent_format()) +
xlab("") +
ylab("") +
coord_flip();
添加 scale_x_discrete(drop=FALSE)
以保持空系数水平。为了在不更改原始数据框的情况下反转因子水平的顺序,我在对 ggplot
的调用中进行了更改。我还对代码进行了一些其他调整。此外,您不需要所有这些分号。
library(ggplot2)
library(scales)
library(reshape2) # For melt function
library(dplyr) # For chaining (%>%) operator
df = read.csv2("data.csv", fileEncoding="UTF-8")
df[df=="0"]<-NA; # Removed quotes from NA
df[df=="1"]<-"Great";
df[df=="2"]<-"Good";
df[df=="3"]<-"OK";
df[df=="4"]<-"Not Good";
df[df=="5"]<-"Horrible";
# four entries
df$ID = c(1:4);
df.molten <- melt(df, id.vars="ID");
# Only need to set factor levels once. No need for the other four calls to factor in
# the original code. Also, I removed the "NA" level.
df.molten$value <- factor(df.molten$value, levels = c("Great", "Good", "OK", "Not Good", "Horrible"));
# First line reverses factor levels
ggplot(df.molten %>% mutate(value=factor(value, levels=rev(levels(value)))),
aes(x = value, fill=value)) +
geom_bar(aes(y = (..count..)/8)) +
theme(axis.text.x = element_text(angle = 45, hjust = 1, face=2),
legend.position="none",
axis.text= element_text(size=12),
axis.title=element_text(size=14,face="bold"),
panel.background = element_rect(fill = "white")) +
scale_fill_manual(values=c("blue4","steelblue2", "blue4","steelblue2", "blue4")) +
facet_wrap( "variable" ) +
scale_y_continuous(breaks=seq(0, 1, 0.1), labels = percent_format()) +
scale_x_discrete(drop=FALSE) + # To keep empty factor levels
labs(x="", y="") + # Just to be more concise
coord_flip()
我还没有深入探讨这个问题。我有一个使用 ggplot2 的多面条形图并正在寻找一种方法:
1) 让它显示我的问卷参与者没有选择的类别(例如,如果类别 5 ("Horrible") 从未被选择过,我仍然希望它显示在图表中(没有条)以显示完整的可能答案集并使图表更易于阅读)。
2) 我想翻转多面图中的 Y 轴,使 "Great" 在顶部,"Horrible" 在底部。有没有办法在不更改数据的情况下做到这一点?
随函附上我目前拥有的完整、独立的小型示例。我仍然是 R-Newbee,所以如果你有关于如何使这个更短更简单的建议(我相信有很多可以减少),我很高兴听到你的建议。
data.csv:
ONE;TWO;THREE;FOUR
1;1;2;1
1;2;3;2
2;2;3;2
3;2;4;3
code.R
library(ggplot2)
library(scales)
df = read.csv2("data.csv", fileEncoding="UTF-8")
df[df=="0"]<-NA;
df[df=="1"]<-"Great";
df[df=="2"]<-"Good";
df[df=="3"]<-"OK";
df[df=="4"]<-"Not Good";
df[df=="5"]<-"Horrible";
# four entries
df$ID = c(1:4);
# turn to factors
df$ONE = factor(df$ONE, levels = c("NA", "Great", "Good", "OK", "Not Good", "Horrible"));
df$TWO = factor(df$TWO, levels = c("NA", "Great", "Good", "OK", "Not Good", "Horrible"));
df$THREE = factor(df$THREE, levels = c("NA", "Great", "Good", "OK", "Not Good", "Horrible"));
df$FOUR = factor(df$FOUR, levels = c("NA", "Great", "Good", "OK", "Not Good", "Horrible"));
df.molten <- melt(df, id.vars="ID");
df.molten$value <- factor( df.molten$value, levels = c("NA", "Great", "Good", "OK", "Not Good", "Horrible") );
ggplot( df.molten , aes( x = value, fill=value ) ) +
geom_bar(aes(y = (..count..)/8)) +
theme(axis.text.x = element_text(angle = 45, hjust = 1, face=2),
legend.position="none",
axis.text= element_text(size=12),
axis.title=element_text(size=14,face="bold"),
panel.background = element_rect(fill = "white")) +
scale_fill_manual(values=c("blue4","steelblue2", "blue4","steelblue2", "blue4")) +
facet_wrap( "variable" ) +
scale_y_continuous(breaks=seq(0, 1, 0.1), labels = percent_format()) +
xlab("") +
ylab("") +
coord_flip();
添加 scale_x_discrete(drop=FALSE)
以保持空系数水平。为了在不更改原始数据框的情况下反转因子水平的顺序,我在对 ggplot
的调用中进行了更改。我还对代码进行了一些其他调整。此外,您不需要所有这些分号。
library(ggplot2)
library(scales)
library(reshape2) # For melt function
library(dplyr) # For chaining (%>%) operator
df = read.csv2("data.csv", fileEncoding="UTF-8")
df[df=="0"]<-NA; # Removed quotes from NA
df[df=="1"]<-"Great";
df[df=="2"]<-"Good";
df[df=="3"]<-"OK";
df[df=="4"]<-"Not Good";
df[df=="5"]<-"Horrible";
# four entries
df$ID = c(1:4);
df.molten <- melt(df, id.vars="ID");
# Only need to set factor levels once. No need for the other four calls to factor in
# the original code. Also, I removed the "NA" level.
df.molten$value <- factor(df.molten$value, levels = c("Great", "Good", "OK", "Not Good", "Horrible"));
# First line reverses factor levels
ggplot(df.molten %>% mutate(value=factor(value, levels=rev(levels(value)))),
aes(x = value, fill=value)) +
geom_bar(aes(y = (..count..)/8)) +
theme(axis.text.x = element_text(angle = 45, hjust = 1, face=2),
legend.position="none",
axis.text= element_text(size=12),
axis.title=element_text(size=14,face="bold"),
panel.background = element_rect(fill = "white")) +
scale_fill_manual(values=c("blue4","steelblue2", "blue4","steelblue2", "blue4")) +
facet_wrap( "variable" ) +
scale_y_continuous(breaks=seq(0, 1, 0.1), labels = percent_format()) +
scale_x_discrete(drop=FALSE) + # To keep empty factor levels
labs(x="", y="") + # Just to be more concise
coord_flip()