如何在 R ggplot2 中用多个变量标记轴
How to label an axis with several variables in R ggplot2
我有一个数据框如下:
Name,Tutor,Test,Score,Percent,school.year
Mark,Eric,Maths,100,100,2
Mark,Eric,English,91,91,2
Sue,Richard,Maths,88,100,5
Sue,Richard,English,71,80.7,5
我想在 y 轴上绘制百分比,在 x 轴上绘制名称,并为每个测试绘制条形图。我的代码按照我想要的方式绘制,但 x 轴标签只是名称。我想在 x 轴上添加其他变量(仅添加到标签中)。因此,例如标记有 2 个条; 1 个用于数学,1 个用于英语,他的 xaxis 标签还带有 'mark' '\n' 'Eric' 这样我们就可以看到谁辅导了他。如果可能的话,我想添加几个额外的标签,例如学年。到目前为止,我的代码如下;
results <- read.csv('results.csv')
p <- ggplot(results, aes(y=Percent, x=Name, colour=Test, fill=Test)) +
geom_bar(stat='identity', position='dodge') +
ggtitle('Test Results') +
ylab('Percent')
我可以绘制单个变量作为 x 轴标签,例如:
+scale_x_discrete(labels = results$Score)
或者手动更改(虽然顺序有问题);
scale_x_discrete(标签=c('Mark \n Eric','Sue \n Richard',等等))
有没有办法将其他变量添加到 x 标签中,最好使用换行符?非常感谢
我建议在您的数据框中创建另一列,其中将包含标签,然后将其用作 x
:
results$label <- paste(results$Name,results$Tutor,sep='\n')
ggplot(results, aes(y=Percent, x=label, colour=Test, fill=Test)) +
geom_bar(stat='identity', position='dodge') +
ggtitle('Test Results') +
ylab('Percent')
我有一个数据框如下:
Name,Tutor,Test,Score,Percent,school.year
Mark,Eric,Maths,100,100,2
Mark,Eric,English,91,91,2
Sue,Richard,Maths,88,100,5
Sue,Richard,English,71,80.7,5
我想在 y 轴上绘制百分比,在 x 轴上绘制名称,并为每个测试绘制条形图。我的代码按照我想要的方式绘制,但 x 轴标签只是名称。我想在 x 轴上添加其他变量(仅添加到标签中)。因此,例如标记有 2 个条; 1 个用于数学,1 个用于英语,他的 xaxis 标签还带有 'mark' '\n' 'Eric' 这样我们就可以看到谁辅导了他。如果可能的话,我想添加几个额外的标签,例如学年。到目前为止,我的代码如下;
results <- read.csv('results.csv')
p <- ggplot(results, aes(y=Percent, x=Name, colour=Test, fill=Test)) +
geom_bar(stat='identity', position='dodge') +
ggtitle('Test Results') +
ylab('Percent')
我可以绘制单个变量作为 x 轴标签,例如:
+scale_x_discrete(labels = results$Score)
或者手动更改(虽然顺序有问题);
scale_x_discrete(标签=c('Mark \n Eric','Sue \n Richard',等等))
有没有办法将其他变量添加到 x 标签中,最好使用换行符?非常感谢
我建议在您的数据框中创建另一列,其中将包含标签,然后将其用作 x
:
results$label <- paste(results$Name,results$Tutor,sep='\n')
ggplot(results, aes(y=Percent, x=label, colour=Test, fill=Test)) +
geom_bar(stat='identity', position='dodge') +
ggtitle('Test Results') +
ylab('Percent')