File:English Wikipedia article for creation (AfC) decline reasons chart – Business AfCs (by 16 subcategories).svg
| Uploaded by | Prototyperspective |
|---|---|
| Upload date | 2026-04-22T22:35:21Z |
| MIME type | image/svg+xml |
| Dimensions | 1309 × 1383 px |
| File size | 165.4 KB |
Summary
| Description |
English: Visualization of the data in the Wikipedia AfC approval rates report – "This study presents the first large-scale empirical audit of Wikipedia’s English-language Articles for creation (AfC) workflow, which is the primary process for new, inexperienced, and conflict-of-interest users to create Wikipedia articles. Lumino analyzed 1,009 draft submissions that survived initial triage during two sampling windows in late 2025." |
| Date | |
| Source | Own work; Data source: https://www.luminodigital.com/wikipedia-afc-approval-rates-report |
| Author | Prototyperspective |
SVG development
Source code
Python code
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import seaborn as sns
# Data
data = {
"Category": [
"Business (all entries)", "Construction", "Entertainment", "Finance", "Healthcare",
"Hospitality", "Legal", "Manufacturer", "Marketing", "Media", "Other",
"Product", "Real estate", "Resource extraction", "Retail", "Technology", "Transportation"
],
"Total": [142, 2, 7, 9, 7, 11, 1, 12, 1, 5, 3, 13, 3, 4, 12, 47, 5],
"Approved": [22, 0, 1, 1, 3, 3, 0, 1, 0, 1, 0, 3, 1, 2, 1, 3, 2],
"Declined": [117, 2, 6, 8, 4, 7, 1, 11, 1, 4, 3, 10, 2, 2, 11, 42, 3],
"Draft": [2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0],
"Deleted/Other": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
"Approval%": [15, 0, 14, 11, 43, 27, 0, 8, 0, 20, 0, 23, 33, 50, 8, 6, 40],
"Decline%": [82, 100, 86, 89, 57, 64, 100, 92, 100, 80, 100, 77, 67, 50, 92, 89, 60],
}
df = pd.DataFrame(data)
sns.set(style="whitegrid")
palette = sns.color_palette(["#4CAF50", "#F44336", "#FFC107", "#9E9E9E"])
fig = plt.figure(constrained_layout=False, figsize=(12, 10))
gs = fig.add_gridspec(3, 2, height_ratios=[1, 1, 0.7], width_ratios=[1, 0.02], hspace=0.35)
# 1) Stacked bar: Approved / Declined / Others
ax0 = fig.add_subplot(gs[0, 0])
ind = np.arange(len(df))
width = 0.6
p1 = ax0.bar(ind, df["Approved"], width, label="Approved", color=palette[0])
p2 = ax0.bar(ind, df["Declined"], width, bottom=df["Approved"], label="Declined", color=palette[1])
bottom2 = df["Approved"] + df["Declined"]
p3 = ax0.bar(ind, df["Draft"], width, bottom=bottom2, label="Draft", color=palette[2])
p4 = ax0.bar(ind, df["Deleted/Other"], width, bottom=bottom2 + df["Draft"], label="Deleted/Other", color=palette[3])
ax0.set_xticks(ind)
ax0.set_xticklabels(df["Category"], rotation=45, ha="right", fontsize=9)
ax0.set_ylabel("Count")
ax0.set_title("Submission Outcomes by Business Category (stacked)")
ax0.legend(frameon=False, fontsize=9)
ax0.set_ylim(0, df["Total"].max() * 1.08)
for i, tot in enumerate(df["Total"]):
ax0.text(i, tot + df["Total"].max() * 0.01, str(tot), ha="center", fontsize=8, weight="bold")
# 2) Approval vs Decline % grouped bars
ax1 = fig.add_subplot(gs[1, 0])
w = 0.35
ax1.bar(ind - w/2, df["Approval%"], w, label="Approval %", color="#1976D2")
ax1.bar(ind + w/2, df["Decline%"], w, label="Decline %", color="#D32F2F")
ax1.set_xticks(ind)
ax1.set_xticklabels(df["Category"], rotation=45, ha="right", fontsize=9)
ax1.set_ylabel("Percentage (%)")
ax1.set_ylim(0, 105)
ax1.set_title("Approval vs Decline Percentage by Business Category")
ax1.legend(frameon=False, fontsize=9)
for i, (a, d) in enumerate(zip(df["Approval%"], df["Decline%"])):
ax1.text(i - w/2, a + 3, f"{a}%", ha="center", fontsize=8)
ax1.text(i + w/2, d + 3, f"{d}%", ha="center", fontsize=8)
# 3) Horizontal bar: Declined count proportion (sorted) to highlight problem areas
ax2 = fig.add_subplot(gs[2, 0])
decline_prop = df["Declined"] / df["Total"] * 100
order = decline_prop.sort_values(ascending=False).index
y_pos = np.arange(len(df))
ax2.barh(y_pos, decline_prop.iloc[order], color="#F44336")
ax2.set_yticks(y_pos)
ax2.set_yticklabels(df["Category"].iloc[order], fontsize=9)
ax2.set_xlabel("Declined as % of Total")
ax2.set_title("Decline Proportion by Business Category (sorted)")
for i, val in enumerate(decline_prop.iloc[order]):
ax2.text(val + 1, i, f"{val:.0f}%", va="center", fontsize=8)
plt.tight_layout(rect=[0, 0, 1, 0.98])
plt.show()
Licensing
I, the copyright holder of this work, hereby publish it under the following license:
This file is licensed under the Creative Commons Attribution 4.0 International license.
- You are free:
- to share – to copy, distribute and transmit the work
- to remix – to adapt the work
- Under the following conditions:
- attribution – You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.