我有一个像这样的data.frame:
df <- read.csv(text = "ONE,TWO,THREE
23,234,324
34,534,12
56,324,124
34,234,124
123,534,654")
Run Code Online (Sandbox Code Playgroud)
我想生成一个百分比条形图,看起来像这样(在LibreOffice Calc中制作):

因此,条形应该标准化,因此所有堆叠具有相同的高度并且总和为100%.到目前为止,我所能获得的是一个堆积的条形图(不是百分比),使用:
barplot(as.matrix(df))
Run Code Online (Sandbox Code Playgroud)
有帮助吗?
我想生成一个看起来像这样的图形:

我的原始数据集看起来像这样:
> bb[sample(nrow(bb), 20), ]
IMG QUANT FIX
25663 1 1 0
7936 2 2 0
23586 3 2 0
23017 2 2 1
31363 1 3 1
7886 2 2 0
23819 3 3 1
29838 2 2 1
8169 2 3 1
9870 2 3 0
31440 2 1 0
35564 3 1 0
24066 1 2 0
12020 3 2 0
6742 3 2 0
6189 2 3 0
26692 2 3 0
1387 3 2 …Run Code Online (Sandbox Code Playgroud) 我正在用ggplot2开发一个图形,其中我需要在其他图形元素上叠加文本.根据文本底层元素的颜色,可能难以阅读文本.有没有办法在具有半透明背景的边界框中绘制geom_text?
我可以用plotrix做到这一点:
library(plotrix)
Labels <- c("Alabama", "Alaska", "Arizona", "Arkansas")
SampleFrame <- data.frame(X = 1:10, Y = 1:10)
TextFrame <- data.frame(X = 4:7, Y = 4:7, LAB = Labels)
### plotrix ###
plot(SampleFrame, pch = 20, cex = 20)
boxed.labels(TextFrame$X, TextFrame$Y, TextFrame$LAB,
bg = "#ffffff99", border = FALSE,
xpad = 3/2, ypad = 3/2)
Run Code Online (Sandbox Code Playgroud)
但我不知道用ggplot2获得类似结果的方法:
### ggplot2 ###
library(ggplot2)
Plot <- ggplot(data = SampleFrame,
aes(x = X, y = Y)) + geom_point(size = 20)
Plot <- Plot + geom_text(data = TextFrame, …Run Code Online (Sandbox Code Playgroud) 我正在尝试绘制看起来信息丰富,清晰整洁的标签.
我是下面的例子,并提出一个问题关于label和axis格式.
例如,我的销售数据包括欧元的品牌,类别和支出.当欧元的总和很大(数百万或更多)时,标签看起来很难阅读而且没有提供信息.
结果,x-axis是,Scientific notation并且看起来也非常不洁净.
我已经设法以自定义方式格式化标签:它显示数千欧元.
geom_text(aes(label= paste(round(EUR/1000,0),"€"), y=pos), colour="white")
有更简单或自动化的方式吗?
由于Scientific notation看起来真的不清楚,对于轴我尝试使用scale_y_continuous(formatter = "dollar"),但这似乎不工作.而且,我无法找到是否Eur还实施而不是美元.我相信,这将是最好的展现y-axis在thousands.有解决方案吗
另外,我附上可重复的例子:
library(plyr)
library(dplyr)
library(ggplot2)
library(scales)
set.seed(1992)
n=68
Category <- sample(c("Black", "Red", "Blue", "Cyna", "Purple"), n, replace = TRUE, prob = NULL)
Brand <- sample("Brand", n, replace = TRUE, prob = NULL)
Brand <- paste0(Brand, sample(1:5, n, replace = TRUE, prob = NULL))
EUR <- abs(rnorm(n))*100000 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用这种方法在堆积条形图上放置标签(但如果现在有更好的方法,我会对所有情况持开放态度):
这是我原来的情节:
dat <- data.frame(with(mtcars, table(cyl, gear)))
ggplot(dat, aes(x = gear, fill = cyl)) +
geom_bar(aes(weight=Freq), position="stack") +
geom_text(position = "stack", aes(x = gear, y = Freq,
ymax = 15, label = cyl), size=4)
Run Code Online (Sandbox Code Playgroud)

这是我尝试在每个填充部分中居标签:
dat2 <- ddply(dat, .(cyl), transform, pos = cumsum(Freq) - 0.5*Freq)
library(plyr)
ggplot(dat2, aes(x = gear, fill = cyl)) +
geom_bar(aes(weight=Freq), position="stack") +
geom_text(position = "stack", aes(x = gear, y = pos,
ymax = 15, label = cyl), size=4)
Run Code Online (Sandbox Code Playgroud)

如何将每个填充部分中的标签居中?
我是 ggplot2 (和 R)的新手,我正在尝试制作一个填充条形图,每个框中都有标签,指示组成该块的百分比。
这是我当前图形的示例,我想向其中添加标签:
##ggplot figure
library(gpplot2)
library(scales)
#specify order I want in plots
ZIU$Affinity=factor(ZIU$Affinity, levels=c("High", "Het", "Low"))
ZIU$Group=factor(ZIU$Group, levels=c("ZUM", "ZUF", "ZIM", "ZIF"))
ggplot(ZIU, aes(x=Group))+
geom_bar(aes(fill=Affinity), position="fill", width=1, color="black")+
scale_y_continuous(labels=percent_format())+
scale_fill_manual("Affinity", values=c("High"="blue", "Het"="lightblue", "Low"="gray"))+
labs(x="Group", y="Percent Genotype within Group")+
ggtitle("Genotype Distribution", "by Group")
Run Code Online (Sandbox Code Playgroud)
我尝试使用此代码添加标签,但它不断生成错误消息“错误:geom_text 需要以下缺失的美学:y”,但我的图没有 y 美学,这是否意味着我不能使用 geom_text?(另外,我不确定一旦 y 美学问题得到解决,geom_text 语句的其余部分是否能够实现我想要的效果,即每个框中居中的白色标签。)
ggplot(ZIU, aes(x=Group)) +
geom_bar(aes(fill=Affinity), position="fill", width=1, color="black")+
geom_text(aes(label=paste0(sprintf("%.0f", ZIU$Affinity),"%")),
position=position_fill(vjust=0.5), color="white")+
scale_y_continuous(labels=percent_format())+
scale_fill_manual("Affinity", values=c("High"="blue", "Het"="lightblue", "Low"="gray"))+
labs(x="Group", y="Percent Genotype within Group")+
ggtitle("Genotype Distribution", "by Group")
Run Code Online (Sandbox Code Playgroud)
另外,如果有人有消除 NA …
以下代码提供了精美的堆积条形图
cls.grp <- gl(n=4,k=20,labels=c("group a","group b","group c", "group d"))
ser <- sample(x=c("neg","pos"),size=80,replace=TRUE, prob=c(30,70))
syrclia <- data.frame(cls.grp,ser)
ggplot(syrclia, aes(cls.grp, fill=ser))+ geom_bar()
Run Code Online (Sandbox Code Playgroud)
我期待使用geom_text或stat_summary,我可以在每个组中标记为负数的百分比,并将其放在相应的栏上.我尝试了许多排列,无法让它发挥作用.我甚至尝试手动输入百分比并强制标签在我想要的地方,但它不起作用.它需要80个标签,而我只想给出4个负数或者8个(如果一个包含百分比标签为正数).
我真的必须制作我的syrclia的聚合数据框并绘制该图吗?
我已经成功地在 R 中制作了一个堆叠条形图,其中几个不同类别的百分比加起来为 100%。我在这里制作了一个示例数据框。
example.Category<- c("Cat1","Cat2","Cat3","Cat4","Cat5","Cat6")
percent.good <- c(.25,.29,.45,.5,.8,.82)
example.data <- data.frame(example.Category,percent.good)
example.data$percent.bad <- (1-example.data$percent.good)
Run Code Online (Sandbox Code Playgroud)
数据框看起来像这样。
example.Category percent.good percent.bad
1 Cat1 0.25 0.75
2 Cat2 0.29 0.71
3 Cat3 0.45 0.55
4 Cat4 0.50 0.50
5 Cat5 0.80 0.20
6 Cat6 0.82 0.18
Run Code Online (Sandbox Code Playgroud)
然后我使用 reshape 包中的melt来得到这个......
example.melt <- melt(example.data, id.vars="example.Category")
example.Category variable value
1 Cat1 percent.good 0.25
2 Cat2 percent.good 0.29
3 Cat3 percent.good 0.45
4 Cat4 percent.good 0.50
5 Cat5 percent.good 0.80
6 Cat6 percent.good 0.82
7 Cat1 percent.bad …Run Code Online (Sandbox Code Playgroud) # Loading data
data(CPS85, package = "mosaicData")
# Count the number of females and males in each sector
plotdata <- group_by(CPS85,sector) %>%
count(sex)
# Print the data
print(plotdata)
# Construct a ggplot object according requirement above and assign it to 'plt'
plt <- ggplot(plotdata,
aes(x = sector,
y = n))+
geom_col(aes(fill=sex))+
geom_text(aes(label=n),
position = position_stack(vjust = 0.5))+
labs(x = "",
y = "Number of persons",
title = "")
# Display the stacked bar chart
plt
Run Code Online (Sandbox Code Playgroud)
我怎样才能改变我的 vjust 使数字位于堆积条的中间
我试图绘制两个因子变量,并在图中用 % 标记结果。
我已经检查了这篇文章和他/她提供的链接:
您在这里看到的 ggplot 行实际上来自推荐的帖子之一:
sex <- c("F","F","M", "M", "M", "F","M","F","F", "M", "M", "M", "M","F","F", "M", "M", "F")
behavior <- c("A", "B", "C", "A", "B", "C", "A", "B", "C", "A", "B", "C", "A", "B", "C", "B", "C", "A")
BehSex <- data.frame(sex, behavior)
ggplot(BehSex, aes(x= factor(sex), fill= factor(behavior), y = (..count..)/sum(..count..)))+
geom_bar() +
stat_bin(geom = "text",
aes(label = paste(round((..count..)/sum(..count..)*100), "%")),
vjust = 5)
Run Code Online (Sandbox Code Playgroud)
但是,当我使用该行时,出现以下错误:
错误:StatBin 需要一个连续的 x 变量:x 变量是离散的。也许你想要 stat="count"?
我尝试在 geom_bar() 中使用 stat="count" 但它似乎没有按预期工作。
三个问题:
1)我做错了什么?
2)我怎样才能绘制出我想要的图? …