width and gap of geom_bar (ggplot2) - r
I want to make bar plots using ggplot. After plotting when i do export > copy to clipboard and then try to adjust the size of my plot, the gaps between the bars change as I change the size of the plot (the gaps between the bars change its position).
I hope I am clear on this. I have used the following code:
ggplot(df, aes(Day, Mean)) +
geom_histogram(stat = "identity", position = "stack") +
theme(axis.text = element_text(size=12, colour = 'black')) +
ylim(0, 50) + xlim(0, 365)
I have tried using both geom_bar and geom_histogram, both seems to give the same plot. And the gaps between the bars changes as I adjust the size.
P.S. I have to plot 365 bars, each one representing one day of a year.
Feel free to edit the question, if you think that i am unclear.
This is the plot produced with the code. You can clearly see the uneven gaps in between.
here is the data:
data
Edit
data
df <- data.frame(Mean=c(0,0,0,0,0,0,0.027272727,0,0.409090909,0.009090909,0,0,0,0,0,0.054545455,0.036363636,0.118181818,0.327272727,0.254545455,0,0,1.609090909,1.636363636,0,0.181818182,1.2,0.090909091,0.409090909,0.418181818,1.018181818,0.409090909,0.127272727,0.072727273,0.054545455,1.2,0.127272727,0.290909091,0,0.518181818,0.254545455,0.454545455,1.545454545,1.1,1.763636364,0,0.136363636,0.7,0.445454545,1.954545455,0.018181818,0,2.618181818,0,0,3.518181818,7.645454545,2.709090909,5.909090909,0.9,1.109090909,2.354545455,0.418181818,0.272727273,0,0,1.636363636,0,2.927272727,0.472727273,1,0,2.109090909,0.490909091,0.827272727,2.663636364,4.8,0.554545455,6.3,3.936363636,2.218181818,0.045454545,0,7.109090909,0,3.745454545,3.009090909,8.818181818,6,21.99090909,2.845454545,3.918181818,1.4,12.32727273,1.136363636,4.345454545,1.018181818,2.927272727,12.53636364,2.618181818,0.709090909,5.645454545,5.345454545,3.181818182,2.681818182,13.96363636,3.990909091,9.9,12.54545455,8.545454545,11.43636364,6.281818182,1.836363636,11.4,4.827272727,16.14545455,3.581818182,1.972727273,3.4,4.472727273,18.86363636,5,11.4,5.790909091,3.745454545,1.072727273,2.581818182,5.063636364,12.42727273,9.2,10.85454545,15.18181818,5.963636364,22.53636364,5.027272727,7,4.572727273,7.190909091,15.42727273,7.3,23.48181818,30.87272727,19.62727273,6.463636364,16.20909091,9.509090909,5.1,8.127272727,5.890909091,11.84545455,10.14545455,4.518181818,15.23636364,22.41818182,21.62727273,7.245454545,19.56363636,33.94545455,26.98181818,9.027272727,11.28181818,20.44545455,27.52727273,23.25454545,28.77272727,20.04545455,30.68181818,28.32727273,12.38181818,13.54545455,18.17272727,12.97272727,38.14545455,20.2,14.30909091,39.44545455,34.4,34.49090909,23.32727273,29.37272727,50.68181818,23.2,16.28,35.02,49,18.86,30.96,37.83,33.01,44.31,25.51,33.76,15.05,24.8,8.99,15.72,41.31,41.47,28.12,44.22,30.63,37.35,15.72,12.86,21.89,18.02,6.32,4.73,24.16,29.12,11.58,24.25,22.69,15.7,24.36,20.05,17.19,26.71,17.84,16.53,9.3,5.11,10.97,19.95,5.65,29.88,34.95,24.14,32.09,9.85,17.49,13.72,7.97,26.21,24.9,26.45,14.1,9.52,18.64,13.43,15.17,26.61,9.84,24.9,16.42,19.58,17.58,22.96,39.61,22.83,15.49,23.64,16.71,3.96,10.17,19.04,28.42,16.64,4.95,9.73,13.45,11.67,8.02,8.71,8.31,17.65,8.41,7.19,11.94,5.15,5.54,5.21,0.88,0.96,6.18,9.46,10.24,17.29,8.95,16.51,6.31,11.4,5.05,8.28,0.26,0,6.19,1.02,0.99,0.94,1.87,0,0.21,3.32,3.33,7.82,2.65,5.21,0.49,1.59,0.05,2.25,0,0,1.09,0.42,0,0.05,0.02,0,0.18,0,0.02,0.05,0.09,0.01,1.01,0,0,2.38,0.42,0.65,0,0,0,0.4,0,0,0,0,0.18,0,0,0,0,0,0.63,0,0,0,0.1,0,0,0,0,0,1.35,0,0,0,0,0,1.62,0.2,0,0,0,1.3,0,0,0,0,0.89,4.55,0), Day=seq(1, 365, 1))
Setting the width to a small value and specifying the color gives me the desired result with gaps between all bars:
ggplot(df, aes(x = Day, y = Mean)) +
geom_bar(stat = "identity", width = 0.1, color = "black") +
theme_bw() +
theme(axis.text = element_text(size = 12))
the resulting plot:
If you want no gaps, use width = 1:
ggplot(df, aes(x = Day, y = Mean)) +
geom_bar(stat = "identity", width = 1) +
theme_bw(base_size = 12)
the resulting plot:
Same problem but with side-by-side bars will be resolved using the width within the position element:
geom_bar(width=0.1, position = position_dodge(width=0.2))
Related
Ggplot2 fill by one condition, but shade by another
I am having trouble with ggplot2. I am trying to plot this boxplot that has several boxes for every x-axis value. Each set of boxplots is divided into two sets, features, and resolutions, with every feature set having boxes for every resolution. My issue is that I want to color(and fill) by feature set, but have different shades of that color for every resolution. I have only been able to color by feature and fill by resolution so far, and this is my code: df %>% ggplot( aes(x=partition, y=value, fill=resolution,color=feature_set)) + scale_color_manual(values = c('black','blue3','darkred')) + geom_boxplot(aes(color=feature_set,fill=resolution),lwd=0.7) + scale_fill_brewer(palette = "Pastel1") + theme( legend.position="right", plot.title = element_text(size=11) ) + theme_bw() + geom_text(data = df,aes(y=1.1,label=max_clusters,color=feature_set),size = 2.5, position = position_dodge(width = 0.85),check_overlap = TRUE) + xlab('label') + ylab('label') + ggtitle("title") + ylim(0,1.1) Thank you so much in advance.
How to scale a bar plot using ggplot2?
I want my bar plot to take up less space, currently there is a lot of white space which is not neccessary. I would like the bins to be a lot closer than they currently are. And since there are only two categories in the X axis I do not see why there is so much space between them. - increasing the bin width would make white space go away, but then the bins become unnaturally large. Code: # Creates plot to show response-rate hubspot_ordering %>% ggplot(aes(x = Replied)) + geom_bar(color = "black", fill = "steelblue", stat = "count", width = 0.1, position = position_dodge(0.9)) + xlab("Kommuners respons på e-post og oppringing") + scale_x_discrete(labels = c("Besvart", "Ingen respons")) + ylab("Antall kommuner") + theme(element_line(size = 0.5)) + theme_bw() -> plot_response_rate Output:
You can change the aspect.ratio in your theme using the following code: df <- data.frame(x=factor(LETTERS[1:2]), y=sample(1:100, 2)) library(ggplot2) ggplot(data=df, aes(x=x, y=y, width=.1)) + geom_bar(stat="identity", position="identity") + theme(aspect.ratio = 2/1) + labs(x="", y="") Output aspect.ratio=2: Output aspect.ratio=1:
Try to draw a line with abline?
ggplot(G, aes(x = State, y = Score, fill = State)) + geom_bar(stat = "identity", position = "identity", width = 0.5) + scale_y_continuous(labels = scales::comma) + coord_flip() This the code I am using and I am trying to add a line at the score of 236 so how to do it and how to improve the chart in general and any edit or suggestion are always welcome.
Just use: geom_hline(yintercept = 236) Might be worth while to reorder your y axis and use fill = Score. It would make the plot look something like this: df %>% ggplot(aes(reorder(State, -Assault), Assault, fill = Assault)) + geom_col(width = 0.75, aes(fill = Assault)) + labs(x = "State") + geom_hline(yintercept = 200, size = 1) + coord_flip() + theme_classic()
You can use geom_vline() to do this. Since you have so many bars you will want to apply the vline after your geom_bar() so that it will show up on top of your bars (rather than underneath where you can only barely see it). ggplot(G, aes(x = State, y = Score, fill = State)) + geom_bar(stat = "identity", position = "identity", width = 0.5) + geom_hline(yintercept=236, color="#000000", linetype="solid") + scale_y_continuous(labels = scales::comma) + coord_flip() All I've done there is add the third line to your example above. ggplot2 always confuses me with horizontal and vertical especially when you do things like coord_flip(). I think I've got it correct (even though it looks wrong it's because of the flip), but if I'm mistaken and the line comes out horizontal replace that third line above with this: geom_vline(xintercept=236, color="#000000", linetype="solid") + and note the only two changes, which are that vline becomes hline and xintercept becomes yintercept.
ggplot2: how to reduce space between narrow width bars, after coord_flip, and panel border
When you have flipped coordinates, how do you reduce the space between bars that are narrow and the panel border? Using the data frame df and the ggplot commands, there is much white space between the bottom bar and the tick marks (and similarly a wide space above the "vendor" bar). df <- data.frame(x = c("firm", "vendor"), y = c(50, 20)) ggplot(df, aes(x = x, y = y)) + geom_bar(stat = "identity", width = 0.4) + theme_tufte() + coord_flip() + labs(x = "", y = "") I tried scale_x_discrete with both limits and expand arguments to no avail as well as position = position dodge, likewise with no effect. This question offers coord_equal to change the aspect ratio, and thereby reduce or eliminate the extra space, but notes that the solution does not work with coord_flip.
I think I have found a solution. You can remove width from geom_bar and introduce theme(aspect.ratio = .2), then you can play with the ratio to find the desired width. And unlike coord_equal or coord_fixed is compatible with coord_flip. ggplot(df, aes(x = x, y = y)) + geom_bar(stat = "identity") + theme_tufte() + theme(aspect.ratio = .2) + coord_flip() + labs(x = "", y = "")
Get values and positions to label a ggplot histogram
Below code works well and it labels the barplot correctly, However, if I try geom_text for a histogram I fail since geom_text requires a y-component and a histogram's y component is not part of the original data. Label an "ordinary" bar plot (geom_bar(stat = "identity") works well: ggplot(csub, aes(x = Year, y = Anomaly10y, fill = pos)) + geom_bar(stat = "identity", position = "identity") + geom_text(aes(label = Anomaly10y,vjust=1.5)) My Problem: How to get the correct y and label (indicated by ?) for geom_text, to put labels on top of the histogram bars ggplot(csub,aes(x = Anomaly10y)) + geom_histogram() geom_text(aes(label = ?, vjust = 1.5)) geom_text requires x, y and labels. However, y and labels are not in the original data, but generated by the geom_histogram function. How can I extract the necessary data to position labels on a histogram?
geom_histogram() is just a fancy wrapper to stat_bin so you can all that yourself with the bars and text that you like. Here's an example #sample data set.seed(15) csub<-data.frame(Anomaly10y = rpois(50,5)) And then we plot it with ggplot(csub,aes(x=Anomaly10y)) + stat_bin(binwidth=1) + ylim(c(0, 12)) + stat_bin(binwidth=1, geom="text", aes(label=..count..), vjust=-1.5) to get
Ok to make it aesthetically appealing here is the solution: set.seed(15) csub <- data.frame(Anomaly10y = rpois(50, 5)) Now Plot it csub %>% ggplot(aes(Anomaly10y)) + geom_histogram(binwidth=1) + stat_bin(binwidth=1, geom='text', color='white', aes(label=..count..), position=position_stack(vjust = 0.5)) resultant plot will be