import pandas as pd
import matplotlib.pyplot as plt
# ===== 可调参数 =====
FIG_WIDTH = 10 # 图宽度(英寸)
FIG_HEIGHT = 5 # 图高度(英寸)
LINE_COLOR = "#0d6efd" # 折线颜色(系统主色)
FILL_ALPHA = 0.2 # 面积填充透明度
TITLE = "急性缺血性脑卒中相关 RCTs 历年发文量分析"
X_LABEL = "发表年份"
Y_LABEL = "发文篇数"
# ===== 加载数据 =====
# 数据源(对应后端 CSV: /hub/DiseaseClinicalReport/demo/view/paperCountByPublishYear.csv)
DATA = [
[1998, 1],
[2005, 8],
[2010, 22],
[2015, 38],
[2019, 62],
[2020, 58],
[2021, 51],
[2022, 45],
[2023, 38],
[2024, 28],
] # 二维表 [[year, count], ...]
df = pd.DataFrame(DATA, columns=["year", "count"])
# ===== 绘图 =====
plt.rcParams["font.sans-serif"] = ["SimHei"] # 中文显示
plt.figure(figsize=(FIG_WIDTH, FIG_HEIGHT))
plt.plot(df["year"], df["count"], marker="o", linewidth=2, color=LINE_COLOR)
plt.fill_between(df["year"], df["count"], alpha=FILL_ALPHA, color=LINE_COLOR)
plt.title(TITLE)
plt.xlabel(X_LABEL)
plt.ylabel(Y_LABEL)
plt.grid(alpha=0.3)
plt.tight_layout()
plt.show()
import pandas as pd
import matplotlib.pyplot as plt
# ===== 可调参数 =====
FIG_WIDTH = 12
FIG_HEIGHT = 5
TITLE = "试验注册、审批、知情同意及资金资助趋势"
X_LABEL = "发表年份"
Y_LABEL = "比率(%)"
LINE_STYLES = { # 每条线的样式
"注册率": {"color": "#0d6efd", "marker": "o"},
"审批率": {"color": "#dc3545", "marker": "s"},
"知情同意率": {"color": "#198754", "marker": "^"},
"基金资助率": {"color": "#fd7e14", "marker": "D"},
}
# ===== 加载数据 =====
# 数据源(对应后端 CSV: /hub/DiseaseClinicalReport/demo/view/trialTrendByYear.csv)
DATA = [
# [year, 注册率, 审批率, 知情同意率, 基金资助率]
[2015, 5.2, 32.1, 48.5, 42.3],
[2016, 6.8, 35.4, 52.1, 46.8],
[2017, 8.5, 38.2, 55.7, 50.2],
[2018, 10.2, 41.5, 59.3, 53.6],
[2019, 12.5, 44.8, 63.1, 57.4],
[2020, 14.8, 47.2, 66.5, 60.1],
[2021, 16.3, 50.6, 69.2, 62.8],
[2022, 18.1, 53.4, 72.5, 65.2],
[2023, 19.5, 55.8, 74.3, 67.5],
[2024, 21.2, 58.3, 76.8, 69.8],
]
df = pd.DataFrame(DATA, columns=["year", "注册率", "审批率", "知情同意率", "基金资助率"])
# ===== 绘图 =====
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.figure(figsize=(FIG_WIDTH, FIG_HEIGHT))
for col, style in LINE_STYLES.items():
plt.plot(df["year"], df[col], label=col, linewidth=2, **style)
plt.title(TITLE)
plt.xlabel(X_LABEL)
plt.ylabel(Y_LABEL)
plt.legend(loc="lower right")
plt.grid(alpha=0.3)
plt.tight_layout()
plt.show()
import pandas as pd
import matplotlib.pyplot as plt
# ===== 可调参数 =====
FIG_WIDTH = 10
FIG_HEIGHT = 5
TITLE = "样本量分布"
X_LABEL = "样本量区间(例)"
Y_LABEL = "研究数量(篇)"
FILL_COLOR = "#0d6efd"
FILL_ALPHA = 0.4
# ===== 加载数据 =====
# 数据源(对应后端 CSV: /hub/DiseaseClinicalReport/demo/view/sampleSizeDistribution.csv)
DATA = [
# [区间, 篇数]
["<100", 322],
["100~199", 183],
["200~299", 24],
["300~499", 3],
["500~999", 4],
["≥1000", 0],
]
df = pd.DataFrame(DATA, columns=["range", "count"])
# ===== 绘图 =====
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.figure(figsize=(FIG_WIDTH, FIG_HEIGHT))
plt.fill_between(df["range"], df["count"], alpha=FILL_ALPHA, color=FILL_COLOR)
plt.plot(df["range"], df["count"], marker="o", linewidth=2, color=FILL_COLOR)
for i, v in enumerate(df["count"]):
plt.text(i, v + 8, str(v), ha="center", fontsize=10, color=FILL_COLOR)
plt.title(TITLE)
plt.xlabel(X_LABEL)
plt.ylabel(Y_LABEL)
plt.grid(alpha=0.3)
plt.tight_layout()
plt.show()
import pandas as pd
import matplotlib.pyplot as plt
# ===== 可调参数 =====
FIG_WIDTH = 12
FIG_HEIGHT = 7
TITLE = "中成药种类频次(按给药途径分组,每途径取 Top5)"
ROUTE_COLORS = { # 各给药途径配色
"口服": "#0d6efd",
"注射": "#dc3545",
"外用": "#198754",
"其他": "#6c757d",
}
# ===== 加载数据 =====
# 数据源(对应后端 CSV: /hub/DiseaseClinicalReport/demo/view/drugByRoute.csv)
DATA = [
# [给药途径, 中成药名称, 涉及研究数(篇)]
["口服", "脑心通胶囊", 48],
["口服", "复方丹参滴丸", 32],
["口服", "通心络胶囊", 28],
["口服", "步长脑心通", 15],
["口服", "血栓心脉宁", 12],
["注射", "疏血通注射液", 56],
["注射", "黄芪注射液", 42],
["注射", "舒血宁注射液", 38],
["注射", "丹参川芎嗪注射液", 25],
["注射", "醒脑静注射液", 18],
["外用", "通窍救心油", 4],
["外用", "云南白药", 3],
["其他", "其他少见给药途径", 5],
]
df = pd.DataFrame(DATA, columns=["route", "drug", "count"])
# ===== 绘图 =====
plt.rcParams["font.sans-serif"] = ["SimHei"]
fig, ax = plt.subplots(figsize=(FIG_WIDTH, FIG_HEIGHT))
# 按给药途径分组画气泡
routes = df["route"].unique()
x_offset = 0
xticks, xlabels = [], []
for route in routes:
sub = df[df["route"] == route]
xs = range(x_offset, x_offset + len(sub))
ax.scatter(xs, sub["count"], s=sub["count"] * 30, alpha=0.6,
color=ROUTE_COLORS.get(route, "#999"), label=route)
for x, (_, row) in zip(xs, sub.iterrows()):
ax.annotate(f"{row['drug']}\n({row['count']})", (x, row["count"]),
ha="center", va="bottom", fontsize=8)
xticks.extend(xs)
xlabels.extend(sub["drug"].tolist())
x_offset += len(sub) + 1
ax.set_title(TITLE)
ax.set_ylabel("涉及研究数(篇)")
ax.set_xticks([])
ax.legend(title="给药途径")
ax.grid(alpha=0.3)
plt.tight_layout()
plt.show()
import pandas as pd
import matplotlib.pyplot as plt
# ===== 可调参数 =====
FIG_WIDTH = 10
FIG_HEIGHT = 6
TITLE = "组间对照方式分布"
X_LABEL = "研究数量(篇)"
BAR_COLOR = "#0d6efd"
TOP_N = 8 # 显示前 N 个对照方式
# ===== 加载数据 =====
# 数据源(对应后端 CSV: /hub/DiseaseClinicalReport/demo/view/comparisonDistribution.csv)
DATA = [
# [对照方式, 篇数]
["中成药+常规治疗 vs. 常规治疗", 195],
["中成药 vs. 西药", 98],
["中成药+西药 vs. 西药", 87],
["中成药 vs. 中成药", 45],
["中成药+西药+常规治疗 vs. 西药+常规治疗", 32],
["中成药 vs. 安慰剂", 3],
["中成药 vs. 空白", 10],
["其他", 66],
]
df = pd.DataFrame(DATA, columns=["comparison", "count"]).head(TOP_N)
# ===== 绘图 =====
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.figure(figsize=(FIG_WIDTH, FIG_HEIGHT))
plt.barh(df["comparison"][::-1], df["count"][::-1], color=BAR_COLOR, alpha=0.7)
for i, v in enumerate(df["count"][::-1]):
plt.text(v + 2, i, str(v), va="center", fontsize=10)
plt.title(TITLE)
plt.xlabel(X_LABEL)
plt.tight_layout()
plt.show()
import pandas as pd
import matplotlib.pyplot as plt
# ===== 可调参数 =====
FIG_WIDTH = 10
FIG_HEIGHT = 6
TITLE = "方法学质量评价(Cochrane RoB)"
X_LABEL = "占比(%)"
RISK_COLORS = { # 风险等级配色
"低风险": "#198754",
"高风险": "#dc3545",
"不清楚": "#ffc107",
}
# ===== 加载数据 =====
# 数据源(对应后端 CSV: /hub/DiseaseClinicalReport/demo/view/cochraneRisk.csv)
DATA = [
# [条目, 低风险%, 高风险%, 不清楚%]
["① 随机序列生成方法", 52.61, 47.39, 0.00],
["② 分配隐藏", 2.80, 97.20, 0.00],
["③ 受试者盲法", 0.56, 99.44, 0.00],
["④ 结果评价盲法", 27.05, 72.95, 0.00],
["⑤ 结果数据的完整性", 92.35, 7.65, 0.00],
["⑥ 选择性报告研究结果", 93.10, 6.90, 0.00],
["⑦ 其他偏倚来源", 0.19, 99.81, 0.00],
]
df = pd.DataFrame(DATA, columns=["item", "低风险", "高风险", "不清楚"])
# ===== 绘图 =====
plt.rcParams["font.sans-serif"] = ["SimHei"]
fig, ax = plt.subplots(figsize=(FIG_WIDTH, FIG_HEIGHT))
left = pd.Series([0.0] * len(df))
for col in ["低风险", "高风险", "不清楚"]:
ax.barh(df["item"], df[col], left=left, label=col,
color=RISK_COLORS[col], alpha=0.8)
left += df[col]
ax.set_title(TITLE)
ax.set_xlabel(X_LABEL)
ax.legend(loc="lower right")
ax.set_xlim(0, 100)
plt.tight_layout()
plt.show()