📌 疾病版可视化清单 — 对应报告 docx 中的图 1~7,以及产品版可复用的扩展图。
新增 = 疾病版独有  |  未标注 = 与产品版一致
📊 相关 RCTs 历年发文量分析 → 报告 图1
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()
📊 试验注册、审批、知情同意及资金资助趋势图 → 报告 图2
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()
📊 各省市自治区发表研究情况 → 产品版扩展图(docx 未要求,分析页可选)
地图 / 条形图 省份分布 TOP10 中国地图热力 或 横向条形图
📊 机构类型分布 → 产品版扩展图(docx 未要求,分析页可选)
饼图 机构类型占比 三级医院 60.07% / 二级医院 23.13% / 其他 16.79%
📊 样本量分布 → 报告 图3
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()
📊 疾病特征分布 新增 → 报告 二、4(无对应图,docx 仅文字+表)
雷达图 / 玫瑰图 6 维度疾病特征 维度:分期/严重程度/病程/病因/临床状态/病变分布 | 面积:篇数
docx 只要求"文字+表格"呈现疾病特征,没有配图。是否在分析页加一张可视化辅助理解?加的话用什么图形?
📊 中成药种类频次图 新增 → 报告 图4
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()
📊 组间对照方式分布 → 报告 图5
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()
📊 7 大核心指标域分布 → 报告 表4(docx 未要求配图,分析页可选)
环形图 / 旭日图 指标域占比(种数 + 频次双维度) 内圈:指标域 | 外圈:指标分类
📊 不良反应事件分布 → 产品版扩展图(docx 未明确,分析页可选)
条形图 不良反应类型频次 Y 轴:不良反应类型 | X 轴:篇数
产品版有 safety_index_by_drug(按药分组)。疾病版按"给药途径"分组还是"中成药品种"分组?
📊 方法学质量评价(Cochrane RoB) → 报告 图7
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()