如何设置R语言barplot的ylim使柱状图在y轴最小值处截断?
Got it, let's figure out how to fix this! The issue here is that base R's barplot() defaults to drawing bars starting at y=0, even when you set a custom ylim to zoom in on a subset of the range. So when you set ylim=c(7,10), the bars still start at 0—they just get cut off at the bottom of the plot, which isn't what you want. Here are two solid ways to make the bars start right at your y-axis minimum:
Method 1: Adjust Bar Heights and Customize Axis Labels
This approach tweaks your data to start from your desired y-axis minimum, then adjusts the axis labels to match your original values:
# Your original data data <- c(8,9,10) # Define the minimum y-value you want to display y_min <- 7 # Calculate adjusted bar heights (subtract the y-axis minimum) adjusted_data <- data - y_min # Draw the bar plot without default axes bp <- barplot(adjusted_data, ylim = c(0, max(adjusted_data)), axes = FALSE, col = "steelblue", ylab = "Value", main = "Truncated Bar Plot (Adjusted Heights)") # Add a custom y-axis with labels matching your original data axis(2, at = 0:(max(data)-y_min), labels = y_min:max(data)) # Add x-axis labels (use your own labels if you have them!) axis(1, at = bp, labels = paste("Group", 1:length(data)))
Method 2: Manually Draw Bars with rect()
If you want full control over every part of the plot, skip barplot() entirely and use rect() to draw each bar from your desired y-axis minimum:
data <- c(8,9,10) y_min <- 7 # Get the x positions where bars would normally be drawn x_positions <- barplot(data, plot = FALSE) # Create an empty plot with your desired y-axis range plot(0, 0, xlim = range(x_positions) + c(-0.5, 0.5), ylim = c(y_min, max(data)), type = "n", # Don't plot any points xlab = "", ylab = "Value", main = "Truncated Bar Plot (Manual Rectangles)") # Draw each bar individually for(i in seq_along(data)){ rect(x_positions[i] - 0.4, # Left x-coordinate y_min, # Bottom y-coordinate x_positions[i] + 0.4, # Right x-coordinate data[i], # Top y-coordinate col = "coral") } # Add x-axis labels axis(1, at = x_positions, labels = paste("Group", 1:length(data)))
Quick Note
If you actually just wanted to zoom in on the y-axis (keeping bars starting at 0 but hiding the lower portion), you could just use barplot(data, ylim = c(7,10))—but it sounds like you want the bars to start at your y-axis minimum, so the methods above are what you need.
内容的提问来源于stack exchange,提问作者Des Grieux

