Q:

How to align text on clustered bar chart in ggplot2?

I'm trying to align the percent frequency of each bar in my clustered bar chart. Right now, my chart looks like this:

Here's the code as well:
ggplot(graph_data, aes(x, Freq)) +
    geom_bar(aes(fill = Pref), position = 'dodge', stat = 'identity') +
    geom_text(aes(label = sprintf("%.0f%%", round(Freq/sum(Freq) * 100))),
              hjust = -0.25) +
    labs(list(x = attr(graph_data, 'seg_label'),
              y = 'Frequency',
              title = paste('Q:', attr(graph_data, 'question')))) +
    scale_y_continuous(limits = c(0, 1.2 * max(graph_data$Freq))) +
    guides(fill = F) +
    coord_flip() +
    annotate("text", x = Inf, y = Inf,
             label = paste0("N = ", sum(graph_data$Freq)),
             hjust = 1.5, vjust = 1.5)

I think the issue can be solved on this snippet of code, but I'm not sure how: 
geom_text(aes(label = sprintf("%.0f%%", round(Freq/sum(Freq) * 100))), hjust = -0.25)

Any help would be greatly appreciated!
Edit: Here's a sample of my data's structure as well:
df <- data.frame(x = rep(c('1824', '2534', '3544'), 3),
                 Pref = rep(c('low', 'neutral', 'high')),
                 Freq = 1:9 * 10)

A:

As mentioned in the comments I think this is a duplicate of Position geom_text on dodged barplot.
But I did it now, so I'll include the code.
ggplot(df, aes(x, Freq, fill = Pref)) +
    geom_bar(position = 'dodge', stat = 'identity') +
    geom_text(aes(label = sprintf("%.0f%%", round(Freq/sum(Freq) * 100))),
          position = position_dodge(width = 0.9), hjust = -0.25) +
    labs(list(x = attr(df, 'seg_label'),
              y = 'Frequency',
              title = paste('Q:', attr(df, 'question')))) +
    scale_y_continuous(limits = c(0, 1.2 * max(df$Freq))) +
    guides(fill = F) +
    coord_flip()

You need to put fill in the original aes so the that geom_text knows which label to dodge by which amount.

