df_fp_wtp <- df |>
filter(!is.na(fair_price), !is.na(willingness_to_pay), !is.na(generosity))
# Left panel: Fair Price vs WTP
p1 <- df_fp_wtp |>
ggplot(aes(x = willingness_to_pay, y = fair_price)) +
geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "grey50", alpha = 0.5) +
geom_abline(slope = 0.5, intercept = 0, linetype = "dotted", color = col_green, alpha = 0.7) +
geom_smooth(method = "lm", formula = y ~ x, se = FALSE, color = "black", linewidth = 0.7, alpha = 0.7) +
geom_point(aes(color = generosity), size = 3, alpha = 0.7) +
scale_color_gradient2(low = col_red, mid = col_orange, high = col_green,
midpoint = 0.5, name = expression(lambda)) +
labs(x = "WTP (r) in €", y = "Fairer Preis (p_f) in €",
title = "Fairer Preis vs. WTP",
subtitle = paste0(
"Pearson r = ",
round(cor(df_fp_wtp$fair_price, df_fp_wtp$willingness_to_pay, use = "complete.obs"), 2),
", N = ", nrow(df_fp_wtp)
)) +
coord_fixed(xlim = c(0, 15), ylim = c(0, 15)) +
scale_x_continuous(breaks = seq(0, 15, 5)) +
scale_y_continuous(breaks = seq(0, 15, 5)) +
theme_minimal()
# Middle panel: PWYW Price vs Fair Price
df_fp_pw_all <- df |>
filter(!is.na(fair_price), !is.na(generosity), !is.na(pwyw_no_purchase))
df_fp_pw <- df_fp_pw_all |>
filter(!is.na(pay_what_you_want), pwyw_no_purchase != 1)
df_fp_pw_no_purchase <- df_fp_pw_all |>
filter(pwyw_no_purchase == 1) |>
mutate(no_purchase_y = -0.9)
n_no_purchase_plot <- nrow(df_fp_pw_no_purchase)
pct_no_purchase_plot <- round(100 * n_no_purchase_plot / nrow(df_fp_pw_all), 1)
p2 <- df_fp_pw |>
ggplot(aes(x = fair_price, y = pay_what_you_want)) +
geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "grey50", alpha = 0.5) +
geom_abline(slope = 0.5, intercept = 0, linetype = "dotted", color = col_green, alpha = 0.7) +
geom_smooth(method = "lm", formula = y ~ x, se = FALSE, color = "black", linewidth = 0.7, alpha = 0.7) +
geom_point(aes(color = generosity), size = 3, alpha = 0.7) +
annotate("rect", xmin = 0, xmax = 15, ymin = -1.6, ymax = -0.2,
fill = "grey97", color = "grey80", linewidth = 0.3) +
geom_point(
data = df_fp_pw_no_purchase,
aes(x = fair_price, y = no_purchase_y, color = generosity),
shape = 17, size = 3.2, alpha = 0.9, inherit.aes = FALSE
) +
annotate(
"text", x = 0.2, y = -0.3, hjust = 0, vjust = 1,
label = paste0("PWYW: Kein Kauf (n = ", n_no_purchase_plot, ", ", pct_no_purchase_plot, "%)"),
size = 3.2, color = "grey30"
) +
scale_color_gradient2(low = col_red, mid = col_orange, high = col_green,
midpoint = 0.5, name = expression(lambda)) +
labs(x = "Fairer Preis (p_f) in €", y = "PWYW-Preis in €",
title = "PWYW-Preis vs. Fairer Preis",
subtitle = paste0(
"Pearson r = ",
round(cor(df_fp_pw$pay_what_you_want, df_fp_pw$fair_price, use = "complete.obs"), 2),
", N (Kauf) = ", nrow(df_fp_pw)
)) +
coord_fixed(xlim = c(0, 15), ylim = c(-1.8, 15)) +
scale_x_continuous(breaks = seq(0, 15, 5)) +
scale_y_continuous(breaks = seq(0, 15, 5), expand = expansion(mult = c(0, 0.02))) +
theme_minimal()
# Right panel: PAAP Threshold Price vs Fair Price
df_fp_paap <- df |>
filter(!is.na(threshold_price), !is.na(fair_price), !is.na(generosity))
p3 <- df_fp_paap |>
ggplot(aes(x = fair_price, y = threshold_price)) +
geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "grey50", alpha = 0.5) +
geom_abline(slope = 0.5, intercept = 0, linetype = "dotted", color = col_green, alpha = 0.7) +
geom_smooth(method = "lm", formula = y ~ x, se = FALSE, color = "black", linewidth = 0.7, alpha = 0.7) +
geom_point(aes(color = generosity), size = 3, alpha = 0.7) +
scale_color_gradient2(low = col_red, mid = col_orange, high = col_green,
midpoint = 0.5, name = expression(lambda)) +
labs(x = "Fairer Preis (p_f) in €", y = "PAAP-Schwellenpreis in €",
title = "PAAP-Schwellenpreis vs. Fairer Preis",
subtitle = paste0(
"Pearson r = ",
round(cor(df_fp_paap$threshold_price, df_fp_paap$fair_price, use = "complete.obs"), 2),
", N = ", nrow(df_fp_paap)
)) +
coord_fixed(xlim = c(0, 15), ylim = c(0, 15)) +
scale_x_continuous(breaks = seq(0, 15, 5)) +
scale_y_continuous(breaks = seq(0, 15, 5)) +
theme_minimal()
p1 + p2 + p3 + plot_layout(guides = "collect", ncol = 3)