R ggplot2条形图更改特定条形的颜色
R ggplot2 bar chart change color of specific bars
我有一个名为 earningsCont 的数据框,我将使用它来制作堆积条形图:
Total Ghost
JPYUSD -39837298.85 0
GBPUSD -1981571.03 -39837299
EURUSD -1251394.07 -41818870
MXNUSD -498204.15 -43070264
NZDUSD -333466.88 -43568468
PLNUSD -215056.56 -43901935
CNYUSD -143457.92 -44116992
AUDUSD -130047.28 -44260449
CADUSD -94396.57 -44390497
CHFUSD -46730.39 -44484893
HKDUSD -24084.79 -44531624
BRLUSD 0.00 -44555709
Diversification -4276539.06 -40279169
Portfolio -40279169.44 0
然后我把它融化成这样:
Var1 Var2 value
1 JPYUSD Total -39837298.85
2 GBPUSD Total -1981571.03
3 EURUSD Total -1251394.07
4 MXNUSD Total -498204.15
5 NZDUSD Total -333466.88
6 PLNUSD Total -215056.56
7 CNYUSD Total -143457.92
8 AUDUSD Total -130047.28
9 CADUSD Total -94396.57
10 CHFUSD Total -46730.39
11 HKDUSD Total -24084.79
12 BRLUSD Total 0.00
13 Diversification Total -4276539.06
14 Portfolio Total -40279169.44
15 JPYUSD Ghost 0.00
16 GBPUSD Ghost -39837298.85
17 EURUSD Ghost -41818869.88
18 MXNUSD Ghost -43070263.95
19 NZDUSD Ghost -43568468.11
20 PLNUSD Ghost -43901934.98
21 CNYUSD Ghost -44116991.55
22 AUDUSD Ghost -44260449.46
23 CADUSD Ghost -44390496.75
24 CHFUSD Ghost -44484893.32
25 HKDUSD Ghost -44531623.72
26 BRLUSD Ghost -44555708.50
27 Diversification Ghost -40279169.44
28 Portfolio Ghost 0.00
我用这段代码制作图表:
ggplot(data=earningsCont, aes(x=Var1, y=value, fill=Var2, order=-as.numeric(Var2))) + geom_bar(stat="identity")+
theme_bw() + theme(panel.border = element_blank(), panel.grid.major = element_blank(),
panel.grid.minor = element_blank(), axis.line = element_line(colour = "black")) +
labs(x="", y="") +
scale_y_continuous(labels = comma) +
ggtitle("Earnings at Risk: Unhedged (USD)") +
scale_fill_manual(values = c(wfGold, wfWhite))+ guides(fill=FALSE)
这使它看起来像所附的图片。如您所见,其中一组列 "Ghost," 是白色的,因此您看不到它。另一个是全金。我只想将最后两个金色列更改为我定义为 wfGreen 和 wfRed 的颜色。
另外,为什么我要把它变成条形图之前必须融化它?现在有没有办法说 series1=earningsCont$Total 和 series2=earningsCont$Ghost?
您正在根据 Var2
的值对条形图着色,其中不包含有关该元素是否是最后两列('Diversification' 和 'Portfolio')之一的信息.您的数据框中需要一个包含此信息的分组列。您可以手动添加,或使用以下(笨拙的)代码:
earningsConst.plot <- within(earningsConst, {
Var3 <- ifelse(Var2 == "Ghost", "Ghost",
ifelse(Var1 == "Diversification", "Div",
ifelse(Var1 == "Portfolio", "Port",
"Total")))
})
这应该创建一个与上一个相同的新数据框,但具有四级着色列 Var3
以提供 fill
美感。您可以将原始代码调整为如下所示:
ggplot(data=earningsCont.plot, aes(x=Var1, y=value, fill=Var3, order=-as.numeric(Var2))) + geom_bar(stat="identity")+
theme_bw() + theme(panel.border = element_blank(), panel.grid.major = element_blank(),
panel.grid.minor = element_blank(), axis.line = element_line(colour = "black")) +
labs(x="", y="") +
scale_y_continuous(labels = comma) +
ggtitle("Earnings at Risk: Unhedged (USD)") +
scale_fill_manual(values = c(wfGold, wfRed, wfWhite, wfGreen))+ guides(fill=FALSE)
请注意,由于您没有 dput
您的数据,我无法测试此代码(我选择不手动输入整个数据框)。虽然我非常确定这应该有效,但我可能在某个地方犯了一个小错误。如果您找到了,请告诉我 - 或者更好 dput(earningsConst)
以便有一个易于重现的示例。
我有一个名为 earningsCont 的数据框,我将使用它来制作堆积条形图:
Total Ghost
JPYUSD -39837298.85 0
GBPUSD -1981571.03 -39837299
EURUSD -1251394.07 -41818870
MXNUSD -498204.15 -43070264
NZDUSD -333466.88 -43568468
PLNUSD -215056.56 -43901935
CNYUSD -143457.92 -44116992
AUDUSD -130047.28 -44260449
CADUSD -94396.57 -44390497
CHFUSD -46730.39 -44484893
HKDUSD -24084.79 -44531624
BRLUSD 0.00 -44555709
Diversification -4276539.06 -40279169
Portfolio -40279169.44 0
然后我把它融化成这样:
Var1 Var2 value
1 JPYUSD Total -39837298.85
2 GBPUSD Total -1981571.03
3 EURUSD Total -1251394.07
4 MXNUSD Total -498204.15
5 NZDUSD Total -333466.88
6 PLNUSD Total -215056.56
7 CNYUSD Total -143457.92
8 AUDUSD Total -130047.28
9 CADUSD Total -94396.57
10 CHFUSD Total -46730.39
11 HKDUSD Total -24084.79
12 BRLUSD Total 0.00
13 Diversification Total -4276539.06
14 Portfolio Total -40279169.44
15 JPYUSD Ghost 0.00
16 GBPUSD Ghost -39837298.85
17 EURUSD Ghost -41818869.88
18 MXNUSD Ghost -43070263.95
19 NZDUSD Ghost -43568468.11
20 PLNUSD Ghost -43901934.98
21 CNYUSD Ghost -44116991.55
22 AUDUSD Ghost -44260449.46
23 CADUSD Ghost -44390496.75
24 CHFUSD Ghost -44484893.32
25 HKDUSD Ghost -44531623.72
26 BRLUSD Ghost -44555708.50
27 Diversification Ghost -40279169.44
28 Portfolio Ghost 0.00
我用这段代码制作图表:
ggplot(data=earningsCont, aes(x=Var1, y=value, fill=Var2, order=-as.numeric(Var2))) + geom_bar(stat="identity")+
theme_bw() + theme(panel.border = element_blank(), panel.grid.major = element_blank(),
panel.grid.minor = element_blank(), axis.line = element_line(colour = "black")) +
labs(x="", y="") +
scale_y_continuous(labels = comma) +
ggtitle("Earnings at Risk: Unhedged (USD)") +
scale_fill_manual(values = c(wfGold, wfWhite))+ guides(fill=FALSE)
这使它看起来像所附的图片。如您所见,其中一组列 "Ghost," 是白色的,因此您看不到它。另一个是全金。我只想将最后两个金色列更改为我定义为 wfGreen 和 wfRed 的颜色。
另外,为什么我要把它变成条形图之前必须融化它?现在有没有办法说 series1=earningsCont$Total 和 series2=earningsCont$Ghost?
您正在根据 Var2
的值对条形图着色,其中不包含有关该元素是否是最后两列('Diversification' 和 'Portfolio')之一的信息.您的数据框中需要一个包含此信息的分组列。您可以手动添加,或使用以下(笨拙的)代码:
earningsConst.plot <- within(earningsConst, {
Var3 <- ifelse(Var2 == "Ghost", "Ghost",
ifelse(Var1 == "Diversification", "Div",
ifelse(Var1 == "Portfolio", "Port",
"Total")))
})
这应该创建一个与上一个相同的新数据框,但具有四级着色列 Var3
以提供 fill
美感。您可以将原始代码调整为如下所示:
ggplot(data=earningsCont.plot, aes(x=Var1, y=value, fill=Var3, order=-as.numeric(Var2))) + geom_bar(stat="identity")+
theme_bw() + theme(panel.border = element_blank(), panel.grid.major = element_blank(),
panel.grid.minor = element_blank(), axis.line = element_line(colour = "black")) +
labs(x="", y="") +
scale_y_continuous(labels = comma) +
ggtitle("Earnings at Risk: Unhedged (USD)") +
scale_fill_manual(values = c(wfGold, wfRed, wfWhite, wfGreen))+ guides(fill=FALSE)
请注意,由于您没有 dput
您的数据,我无法测试此代码(我选择不手动输入整个数据框)。虽然我非常确定这应该有效,但我可能在某个地方犯了一个小错误。如果您找到了,请告诉我 - 或者更好 dput(earningsConst)
以便有一个易于重现的示例。