我制作了一个名为pie_chart.csv的.csv文件。我一直在尝试为其中的每个样本制作一个饼图,其他列是饼图显示的类别。到目前为止,我目前有以下内容:
#Pie Chart
library(readr)
x <- read_csv("pie_chart.csv")
#rename the first column
colnames(x)[colnames(x)=="X1"] <- "Sample"
我对如何从这里继续感到困惑。我已经尝试过for循环,但希望能给予您任何帮助!谢谢!
我转置了数据并尝试使用for循环。在另一个数据集中,此方法有效,但是,对于该数据,却给了我错误:
x <- t(x)
names2 <- colnames(x[,2])[colnames(x) != "Sample"]
for (i in 2:col) {
mypath2 <- file.path("C:","Users", "Prak Lab", "Desktop","REPORTS", "text files",
paste(names2[i],"pie", ".jpg", sep = ""))
jpeg(file = mypath2)
pie(table(x[,i]), labels = x[,1], col = c("darkred","pink"), main = colnames(x[i]))
#title = colnames(x[i])
dev.off()
}
这是头(x):
Sample Reads_used_in_Clonotypes Unsuccessful_Reads Not_used_for_Clonotypes
1 012-915-8-rep1 0.772 0.1540 0.0743
2 012-915-8-rep2 0.888 0.0436 0.0681
3 012-915-8-rep3 0.856 0.0470 0.0966
4 012-915-8-rep4 0.873 0.0525 0.0741
5 012-915-8-rep5 0.860 0.0440 0.0962
6 012-915-8-rep6 0.905 0.0286 0.0667
答案 0 :(得分:0)
我想你的意思是这样的:
这是生成绘图的代码。我加载了ggplot2,reshape和dplyr等几个软件包,因为它们使事情变得更加方便。
# Your code (slightly modified, using read.csv instead)
x <- read.csv("pie_chart.csv")
colnames(x)[colnames(x)=="X"] <- "Sample"
# My code starts here:
library(ggplot2)
library(reshape)
library(dplyr)
# Rearrange the data to make it easier for plotting
x2 <- melt(x, id.vars = "Sample") %>% arrange(Sample, variable)
# Open an empty png file; alternatively you can use pdf("Sample.pdf",....)
png("Sample.png", width = 1600, height = 1600)
# Plot the graph. I changed the theme a little bit but feel free to change any of it
ggplot(x2, aes(x= "", y = value, fill = variable))+ geom_bar(width = 1, stat = "identity") +
coord_polar("y", start=0) +
theme(axis.text.x=element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_blank(),
panel.border = element_blank(),
panel.grid=element_blank(),
axis.ticks = element_blank(),
) +
facet_wrap(~Sample)
# Save the png file
dev.off()
祝你好运!如果您还有其他问题,请告诉我。对于使用ggplot2的饼图,我发现此link非常有用。
答案 1 :(得分:0)
首先:当您使用t(x)
转置数据时,您正在将所有内容转换为character
。这是因为t
返回matrix
,而不是data.frame
。矩阵中的所有内容都必须属于同一类,因此可以找到一个通用类并完成转换:character > numeric > integer > logical
(或小于您的选择),如果有一个字符(或{{1} })列,然后一切都将转换。
如果您确实希望每行一张图片,那么类似的事情可能会起作用。
首先,一些数据:
factor
和循环。我已将jpeg / dev.off代码注释掉,以进行本地演示。我还添加了一种颜色(x <- read.csv(header=TRUE, check.names=FALSE, text = "
,Reads used in Clonotypes,Unsuccessful Reads,Not used for Clonotypes
012-915-8-rep1,0.772143599,0.153575355,0.074281045
012-915-8-rep2,0.888258155,0.043600206,0.068141639
012-915-8-rep3,0.856428962,0.046993738,0.0965773
012-915-8-rep4,0.873364731,0.05249563,0.074139639")
colnames(x)[1] <- "Sample"
表示没有颜色),因为我推断您希望饼图中显示所有三列。如果我不正确,请进行调整。
NA
第一个图表是:
您可能会注意到,如果纵横比和for (i in seq_len(nrow(x))) {
fn <- paste0(x$Sample[i], ".jpg")
# jpeg(file = fn)
pie(unlist(x[i,-1]), col = c(NA, "darkred", "pink"),
main = x$Sample[i])
legend("bottomleft", sprintf("%0.1f%% - %s", 100*x[i,-1], names(x[i,-1])), bty='n')
# dev.off()
}
(radius=
的参数)管理不当,标签将不在页面上播放。
图例很难保持在界限之内……与饼图本身的重叠说明了这一点。
最后,我将引用该函数的帮助文档(?pie
),这是我在犹豫要首先提供此答案的原因:
pie