Create bar plot with logarithmic scale in R

情到浓时终转凉″ 提交于 2021-02-11 13:14:30

问题


I am trying to create a bar plot with a logarithmic scale as my data varies from 3.92 to 65700.

This is the code i have used so far:

beach <- c(PlasticsBlue=3.92, PlasticsGrey=65700, FoamsOrange=17.9, FoamsWhite=51300, RopesGreen=9.71, RopesGreen=3140)
beach
par(mar = c(10, 5, 10, 5))

barplot(beach, names.arg=c("Plastics/Blue", "Plastics/Grey", "Foams/Orange", "Foams/White", "Ropes/Green", "Ropes/Green"), col=c("red2", "slateblue4", "red2", "slateblue4", "red2", "slateblue4", "red2"), legend.text = c("Lowest", "Highest"), args.legend=list(cex=0.75,x="topright"), ylim=c(1,100000), log = ("y"), las=2, ylab = expression("mg g"^-1)) 

Which has given me this graph graph

This is exactly what I'm looking for apart from the log function used means that the next tick mark would be 1000000 which is far too large and therefore currently the y axis is only numbered up to 10000 which does not incorporate my largest values. Is there any way around this to have the y axis numbered up to 100000 whilst still using the log function as this seemed to work when I first made the graph in excel (see graph2 link) graph2

Thanks in advance, Alistair


回答1:


You can always get what if you are willing to fiddle with the details in R. In this case it is easier to bypass R's helpful log axis and construct your own:

options(scipen=8)
out <- barplot(log10(beach), names.arg=c("Plastics/Blue", "Plastics/Grey", "Foams/Orange",
      "Foams/White", "Ropes/Green", "Ropes/Green"), col=c("red2", "slateblue4", "red2",
      "slateblue4", "red2", "slateblue4", "red2"), legend.text = c("Lowest", "Highest"),
       args.legend=list(cex=0.75,x="topright"), ylim=c(0, 5), las=2, yaxt="n",
       ylab = expression("mg g"^-1))
yval <- c(1, 10, 100, 1000, 10000, 100000)
ypos <- log10(yval)
axis(2, ypos, yval, las=1)
text(out, log10(beach), beach, pos=3, xpd=NA)

The first line just keeps R from switching to scientific notation for the 100000 value. The barplot differs in that we convert the raw data with log10() set the ylim based on the log10 values, and suppress the y-axis. Then we create a vector of the positions on the y axis we want to label and get their log10 positions. Finally we print the axis. The last line uses the value out from barplot which returns the positions of the bars on the x axis so we can print the values on the tops of the bars.




回答2:


Using ggplot2 and company could look like:

library(dplyr)
library(ggplot2)
library(tibble)
library(scales)

beach <- c(PlasticsBlue = 3.92, PlasticsGrey = 65700, FoamsOrange = 17.9, FoamsWhite = 51300, RopesGreen = 9.71, RopesGreen = 3140) %>%
  enframe() %>%
  mutate(colorID = rep(c('Lowest', 'Highest'), 3))

plot <- beach %>%
  ggplot(aes(x = 1:nrow(beach), y = value, label = value, fill = colorID)) +
  geom_col(stat = 'identity') +
  scale_y_continuous(trans = "log10", labels = label_number(), breaks = c(1, 10, 100, 1000, 10000, 100000)) +
  scale_x_discrete(labels = beach$name, breaks = 1:nrow(beach), limits = 1:nrow(beach)) +
  geom_text(vjust = -1) +
  theme_minimal() +
  theme(panel.background = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        axis.line.y = element_line(colour = 'black'),
        legend.position = 'right',
        legend.title = element_blank()) +
  labs(y = expression("mg g"^-1),
       x = 'Category/Sample colour') +
  scale_fill_manual(values = rep(c('slateblue4', 'red2'), 3))

This gives us:



来源:https://stackoverflow.com/questions/63180624/create-bar-plot-with-logarithmic-scale-in-r

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!