library(dplyr)
library(ggplot2)
# Create a data frame
set.seed(123)
data <- data.frame(
  numbers = rpois(100, 30)
  )
ggplot(data=data, aes(numbers)) + geom_bar(colour='black', fill='grey')

# Prepare Q-Q plot data
qq_data <- data %>%
  arrange(numbers) %>%  # Step 1: Arrange the numbers in ascending order
  mutate(
    rank = seq(1, n()), # Step 2: Rank each number from 1 to n
    prob = (rank - 0.5) / n(), # Step 3: Calculate empirical cumulative probability
    theoretical_quantile = qpois(prob,30) # Step 4: Calculate theoretical quantiles
  )
qq_data
# Calculate slope and intercept for the Q-Q line
q1_obs <- quantile(qq_data$numbers, probs = 0.25)
q3_obs <- quantile(qq_data$numbers, probs = 0.75)
q1_theo <- qpois(0.25,30)
q3_theo <- qpois(0.75,30)
slope <- (q3_obs - q1_obs) / (q3_theo - q1_theo)
intercept <- q1_obs - slope * q1_theo
# Create the Q-Q plot
(qq_plot <- ggplot(data = qq_data, aes(x = theoretical_quantile, y = numbers)) +
  geom_point(fill = 'green', color = '#203147', shape = 21, size = 2) +  # Points with a border
  labs(title = "Q-Q Plot") +
  geom_abline(slope = slope, intercept = intercept, color = '#203147', linetype = "dashed"))

LS0tCnRpdGxlOiAiUVEgUGxvdCBmb3IgUG9pc3NvbiBEaXN0cmlidXRpb24iCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmBgYAoKCgpgYGB7cn0KIyBDcmVhdGUgYSBkYXRhIGZyYW1lCnNldC5zZWVkKDEyMykKZGF0YSA8LSBkYXRhLmZyYW1lKAogIG51bWJlcnMgPSBycG9pcygxMDAsIDMwKQogICkKYGBgCgoKYGBge3J9CmdncGxvdChkYXRhPWRhdGEsIGFlcyhudW1iZXJzKSkgKyBnZW9tX2Jhcihjb2xvdXI9J2JsYWNrJywgZmlsbD0nZ3JleScpCmBgYAoKCmBgYHtyfQojIFByZXBhcmUgUS1RIHBsb3QgZGF0YQpxcV9kYXRhIDwtIGRhdGEgJT4lCiAgYXJyYW5nZShudW1iZXJzKSAlPiUgICMgU3RlcCAxOiBBcnJhbmdlIHRoZSBudW1iZXJzIGluIGFzY2VuZGluZyBvcmRlcgogIG11dGF0ZSgKICAgIHJhbmsgPSBzZXEoMSwgbigpKSwgIyBTdGVwIDI6IFJhbmsgZWFjaCBudW1iZXIgZnJvbSAxIHRvIG4KICAgIHByb2IgPSAocmFuayAtIDAuNSkgLyBuKCksICMgU3RlcCAzOiBDYWxjdWxhdGUgZW1waXJpY2FsIGN1bXVsYXRpdmUgcHJvYmFiaWxpdHkKICAgIHRoZW9yZXRpY2FsX3F1YW50aWxlID0gcXBvaXMocHJvYiwzMCkgIyBTdGVwIDQ6IENhbGN1bGF0ZSB0aGVvcmV0aWNhbCBxdWFudGlsZXMKICApCmBgYAoKCmBgYHtyfQpxcV9kYXRhCmBgYAoKYGBge3J9CiMgQ2FsY3VsYXRlIHNsb3BlIGFuZCBpbnRlcmNlcHQgZm9yIHRoZSBRLVEgbGluZQpxMV9vYnMgPC0gcXVhbnRpbGUocXFfZGF0YSRudW1iZXJzLCBwcm9icyA9IDAuMjUpCnEzX29icyA8LSBxdWFudGlsZShxcV9kYXRhJG51bWJlcnMsIHByb2JzID0gMC43NSkKcTFfdGhlbyA8LSBxcG9pcygwLjI1LDMwKQpxM190aGVvIDwtIHFwb2lzKDAuNzUsMzApCnNsb3BlIDwtIChxM19vYnMgLSBxMV9vYnMpIC8gKHEzX3RoZW8gLSBxMV90aGVvKQppbnRlcmNlcHQgPC0gcTFfb2JzIC0gc2xvcGUgKiBxMV90aGVvCmBgYAoKCmBgYHtyfQojIENyZWF0ZSB0aGUgUS1RIHBsb3QKKHFxX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBxcV9kYXRhLCBhZXMoeCA9IHRoZW9yZXRpY2FsX3F1YW50aWxlLCB5ID0gbnVtYmVycykpICsKICBnZW9tX3BvaW50KGZpbGwgPSAnZ3JlZW4nLCBjb2xvciA9ICcjMjAzMTQ3Jywgc2hhcGUgPSAyMSwgc2l6ZSA9IDIpICsgICMgUG9pbnRzIHdpdGggYSBib3JkZXIKICBsYWJzKHRpdGxlID0gIlEtUSBQbG90IikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gc2xvcGUsIGludGVyY2VwdCA9IGludGVyY2VwdCwgY29sb3IgPSAnIzIwMzE0NycsIGxpbmV0eXBlID0gImRhc2hlZCIpKQpgYGAKCgoKCgoK