无论 x 标签如何,都保持绘图的大小,无论有多少条,都保持条的大小
Posted
技术标签:
【中文标题】无论 x 标签如何,都保持绘图的大小,无论有多少条,都保持条的大小【英文标题】:Maintain the size of the plot regardless of the x label and maintaining the size of the bars regardless of how many bars there are 【发布时间】:2021-12-03 23:40:51 【问题描述】:我需要得到在 ggplot2 中看起来一致的图形。该脚本每次运行会返回大约 500 个图表,因此不能手动更改它。
我的两个问题是,第一,当标签太长时,图形变小(如图 A 所示);第二,当我有更多条件(更多条形图)时,条形图变窄(如图 B 所示) .我是初学者,所以我需要你的建议,因为我在网上找不到任何东西。另外,剧本不是我的。它来自一位前同事,我正在努力改进它。它有 300 行长,所以我不认为我可以在这里发布。
【问题讨论】:
【参考方案1】:操作。在没有代码的情况下帮助您处理特定情况有点困难,但这里有一个建议,说明如何保持绘图高度一致,因为 x 轴上的名称有所不同。
关于当您有更多条件时缩小列的部分问题......这即将发生。作为替代方案,您希望发生什么?如果您可以指定,我们可以提供帮助 - 也许可以将其作为一个单独的问题并提供可重复的示例。
这是一个可重现的例子:
library(ggplot2)
set.seed(8675309)
df <- data.frame(
x = rep(c("A short label", "A long long long long label", "A medium-sized label here"), each=3),
categories = rep(LETTERS[1:3], 3),
y = sample(1:100, 9)
)
p <-
ggplot(df, aes(x=x, y=y, fill=categories)) +
geom_col(position=position_dodge(0.6), width=0.6, color='black') +
scale_y_continuous(expand=expansion(mult=c(0, 0.05))) +
xlab("This is the X Axis") +
theme_classic() +
theme(
axis.text.x = element_text(angle=35, hjust=1, vjust=1)
)
p
根据该代码,从图上的条形底部到轴标题的距离将根据轴上文本的长度而有所不同。解决这种不一致外观的一种方法是,如果文本长度超过特定的最大长度,则强制文本换行到下一行。我将使用scales
包来做到这一点:
library(scales)
# force text longer than 15 characters to wrap to the next line
p + scale_x_discrete(labels=label_wrap(15))
只要您没有图表,其中 x 轴标签上的所有内容都低于 15 个字符...就可以了。您可能必须使用精确的字符数才能强制换行。
【讨论】:
感谢您的回答。我将在另一条回复评论中回复该脚本:) 如果您愿意,我感谢您的回答和进一步的帮助【参考方案2】:为了缩小我的列,我想缩小我的整体情节的大小。如下图所示,当我绘制 5 个条件时,我得到图 A(列大小为“紫线”。当我绘制 4 个或更少条件时,我得到图 B,它的列大小与 A 不同(见相同的“紫线”现在比列小)。我想得到图 C,它的列大小与 A 相同,但更小(它只是缺少一个列组)。
Figure
我将保留绘制图表的脚本部分:
块引用
###############################################################################
# Part 1: Initialize the variables and setup the general variables (e.g. colors).
figures_case_1 <- list()
Controls_case_1 <- list()
ii <- 1
colors <- c('gray85','green3', 'firebrick1')
text_size <- 20
# Part 2: Create the table with the information to plotted.
for(l in 2:length(all_dataframes))
splitted_doses_first <- unlist(strsplit(as.character(all_dataframes[l][[1]][1,"Dose"]),"\\s"))
# Initialize the dataframe
combined_dataFrame <- data.frame(matrix(ncol = 6, nrow = 0))
x <- c("Activity", "Dose", "STD", "Cell_Population","Drug","dose_number")
colnames(combined_dataFrame) <- x
if(length(splitted_doses_first) > 2)
# Entro a este loop cuando tengo mas de una droga. Desde dos combinaciones en adelante.
for(j in 2:length(all_dataframes))
splitted_doses_second <- unlist(strsplit(as.character(all_dataframes[j][[1]][1,"Dose"]),"\\s"))
if(length(splitted_doses_second) == 2)
# Entro a este loop cuando tenga una droga individual.
intersection <- intersect(splitted_doses_first,splitted_doses_second)
idx <- which(intersection == '+')
if(length(idx) != 0)intersection <- intersection[-idx]
if(length(intersection) == 2 && str_contains(as.character(all_dataframes[l][[1]][1,"Dose"]),
as.character(all_dataframes[j][[1]][1,"Dose"])))
aux <- all_dataframes[j][[1]]
combined_dataFrame <- rbind(aux, combined_dataFrame)
aux <- all_dataframes[1][[1]] # Add DMSO.
combined_dataFrame <- rbind(aux, combined_dataFrame)
# Part 3: Order the table.
combined_dataFrame$dose_number <- as.numeric(as.character(combined_dataFrame$dose_number))
combined_dataFrame <- combined_dataFrame[order(combined_dataFrame["dose_number"]),]
row.names(combined_dataFrame) <- NULL
combined_dataFrame$Dose <- factor(combined_dataFrame$Dose, levels = unique(combined_dataFrame$Dose))
combined_dataFrame <- rbind(combined_dataFrame, all_dataframes[l][[1]])
Controls_case_1[[ii]] = combined_dataFrame
# Part 4: Create the figure.
title_fig <- as.character(all_dataframes[l][[1]][1,"Drug"])
figure <- ggplot(data = combined_dataFrame, aes(x=as.factor(Dose), y=Activity, fill=Cell_Population))+
geom_hline(yintercept=25, linetype="solid", colour = "grey86", size=0.5)+
geom_hline(yintercept=50, linetype="solid", colour = "grey86", size=0.5)+
geom_hline(yintercept=75, linetype="solid", colour = "grey86", size=0.5)+
geom_hline(yintercept=125, linetype="solid", colour = "grey86", size=0.5)+
geom_hline(yintercept=150, linetype="solid", colour = "grey86", size=0.5)+
geom_bar(stat="identity", color="black",
width = 0.8, position = position_dodge(width = 0.9))+
geom_errorbar(aes(ymin=Activity-STD, ymax=Activity+STD), width=.2, alpha=0.9, size=0.5,
position=position_dodge(.9))+
coord_cartesian(ylim = c(0, 150)) +
scale_y_continuous(breaks=c(0,25,50,75,100,125,150)) +
# Counts: y_axes="Events" // Normalized: y_axes = "Survival (%)" // // OnlyDMSO: x_axes= Cell_Population.
labs(title=paste(exp," OP#", patient," \n", title_fig), y = "Survival (%)", x = "Doses (nM)") +
theme(
# panel.grid.major = element_line(colour = "gray48"), #LINEAS DE FONDOS
panel.background = element_rect(fill = "white"), #COLOR DE FRÁFICA FONDO # plot.margin = margin(2, 2, 2, 2, "cm"),
plot.background = element_rect(
fill = "white",
colour = "white",
size = 0.1),
plot.title = element_text(hjust = 0.5, size = text_size * 1.3, face = "bold"),
axis.text.x = element_text(size=text_size,angle=30, hjust=0.5, vjust=0.5, face = "bold"),
axis.text.y = element_text(size=text_size, face = "bold"),
axis.title = element_text(size=text_size * 1.1, face = "bold"),
legend.text= element_text(size=text_size * 1.1, face = "bold"),
legend.title = element_text(size=text_size * 1.1, face = "bold"))+
geom_hline(yintercept=0, linetype="solid", colour = "black", size=0.1)+
geom_segment(aes(x = 0, y = 0, xend = 0, yend = 150))+
geom_hline(yintercept=100, linetype="dashed", colour = "black", size=1)+
scale_fill_manual(values=colors)
# Part 5: Saving independently all the figures.
figures_case_1[[1]] = figure
g <- grid.arrange(grobs = figures_case_1, nrow = 1 ,ncol = 1,gp=gpar(fontsize=2))
ggsave(paste(ii,"-",exp,"-",norm_count," ", title_fig,'.png',sep=""), g,
device = png , path = path_CYT_tables,
width = 12, height = 6,limitsize = FALSE)
ii <- ii + 1
【讨论】:
欢迎来到 SO。理想情况下,这应该添加到您的原始问题中。以上是关于无论 x 标签如何,都保持绘图的大小,无论有多少条,都保持条的大小的主要内容,如果未能解决你的问题,请参考以下文章