绘制两个柱子,一个使用熔体和ggplot堆叠

时间:2018-04-26 15:24:51

标签: r ggplot2 melt

我到处搜索过,似乎找不到这个问题的答案。我有一个包含许多变量的数据框,我想把它们变成一个条形图。

该代码在这里:

Raw_Portfolio_Data <- read_excel("RData2.xlsx", range = "Exposures!  
A10:E47", col_names = FALSE)
Raw_Portfolio_Data <- na.omit(Raw_Portfolio_Data)
Raw_Portfolio_Data <- round(Raw_Portfolio_Data, 2)

names(Raw_Portfolio_Data) <- c  
("Ticker", "Factor_Risk", "Stock_Specific_Risk", "Total_Risk", "Weight")
Raw_Portfolio_Data_melt <- melt(Raw_Portfolio_Data, id.vars = "Ticker")
Raw_Portfolio_Data_melt$value <- round(Raw_Portfolio_Data_melt$value, 2)

“融化”变量看起来像这样(只是几个代码的一个例子)

Ticker       variable         value
AAPL          Factor_Risk      4.66
ABBV          Factor_Risk      1.71
AAPL          Stock_Specific_Risk 0.21
ABBV          Stock_Specific_Risk 0.07
AAPL          Weight              4.00
ABBV          Weight              1.66

那就是说,我的目标是在X轴上设置Ticker,为每个自动收报机设置两个柱。一个柱将代表重量,一个将是STACKED,并且是因子风险和特定股票风险数据的组合。

到目前为止,我没有取得多大进展......

ggplot(Raw_Portfolio_Data_melt, aes(x = Ticker, y = value))

有人能帮帮我吗?你可以告诉我,我是R的新手,而且是ggplot2的新手。谢谢你的时间。

1 个答案:

答案 0 :(得分:0)

对我来说,听起来你想要x轴上的两个变量,Ticker和重量/风险。我们实际上在x轴上实际上没有两个变量,但是解决这个问题的一个简单方法是使用分面,我们可以通过Ticker进行分析并为x轴创建权重/风险变量。为简洁起见,请调用您的数据dd

dd$Type = factor(ifelse(dd$variable == "Weight", "Weight", "Risk"),
                 levels = c("Weight", "Risk"))
ggplot(dd, aes(x = Type, y = value, fill = variable)) +
    geom_col() +
    facet_wrap(~Ticker)

enter image description here

改为使用重量线:

ggplot(dd, aes(x = Ticker, y = value)) +
    geom_col(data = subset(dd, variable != "Weight"), aes(fill = variable)) +
    geom_line(data = subset(dd, variable == "Weight"), aes(group = 1, color = variable)) +
    scale_color_manual(values = "black")

enter image description here

使用此数据:

dd = read.table(text = "Ticker       variable         value
AAPL          Factor_Risk      4.66
ABBV          Factor_Risk      1.71
AAPL          Stock_Specific_Risk 0.21
ABBV          Stock_Specific_Risk 0.07
AAPL          Weight              4.00
ABBV          Weight              1.66", header = T)