【发布时间】:2020-06-30 09:45:03
【问题描述】:
我有一份症状诊断问卷数据,格式如下(python): 路径字典列表。这是一个症状诊断示例,第一个初始症状 (A) 和之后的 2 个问题。
qa= [OrderedDict([('A', 1), ('B', 1), ('F', 1), ('C', 1), ('D', 1), ('E', 1)]),
OrderedDict([('A', 1), ('B', 1), ('F', 1), ('C', 1), ('D', 1), ('E', 0)]),
OrderedDict([('A', 1), ('B', 1), ('F', 1), ('C', 1), ('D', 0), ('E', 1)]),
OrderedDict([('A', 1), ('B', 1), ('F', 1), ('C', 1), ('D', 0), ('E', 0)]),
OrderedDict([('A', 1), ('B', 1), ('F', 1), ('C', 0), ('D', 1), ('E', 1)]),
OrderedDict([('A', 1), ('B', 1), ('F', 1), ('C', 0), ('D', 1), ('E', 0)]),
OrderedDict([('A', 1), ('B', 1), ('F', 1), ('C', 0), ('D', 0), ('E', 1)]),
OrderedDict([('A', 1), ('B', 1), ('F', 1), ('C', 0), ('D', 0), ('E', 0)]),
OrderedDict([('A', 1), ('B', 1), ('F', 0), ('E', 1), ('D', 1), ('C', 1)]),
OrderedDict([('A', 1), ('B', 1), ('F', 0), ('E', 1), ('D', 1), ('C', 0)]),
OrderedDict([('A', 1), ('B', 1), ('F', 0), ('E', 1), ('D', 0), ('C', 1)]),
OrderedDict([('A', 1), ('B', 1), ('F', 0), ('E', 1), ('D', 0), ('C', 0)]),
OrderedDict([('A', 1), ('B', 1), ('F', 0), ('E', 0), ('D', 1), ('C', 1)]),
OrderedDict([('A', 1), ('B', 1), ('F', 0), ('E', 0), ('D', 1), ('C', 0)]),
OrderedDict([('A', 1), ('B', 1), ('F', 0), ('E', 0), ('D', 0), ('C', 1)]),
OrderedDict([('A', 1), ('B', 1), ('F', 0), ('E', 0), ('D', 0), ('C', 0)]),
OrderedDict([('A', 1), ('B', 0), ('F', 1), ('C', 1), ('D', 1), ('E', 1)]),
OrderedDict([('A', 1), ('B', 0), ('F', 1), ('C', 1), ('D', 1), ('E', 0)]),
OrderedDict([('A', 1), ('B', 0), ('F', 1), ('C', 1), ('D', 0), ('E', 1)]),
OrderedDict([('A', 1), ('B', 0), ('F', 1), ('C', 1), ('D', 0), ('E', 0)]),
OrderedDict([('A', 1), ('B', 0), ('F', 1), ('C', 0), ('D', 1), ('E', 1)]),
OrderedDict([('A', 1), ('B', 0), ('F', 1), ('C', 0), ('D', 1), ('E', 0)]),
OrderedDict([('A', 1), ('B', 0), ('F', 1), ('C', 0), ('D', 0), ('E', 1)]),
OrderedDict([('A', 1), ('B', 0), ('F', 1), ('C', 0), ('D', 0), ('E', 0)]),
OrderedDict([('A', 1), ('B', 0), ('F', 0), ('C', 1), ('D', 1), ('E', 1)]),
OrderedDict([('A', 1), ('B', 0), ('F', 0), ('C', 1), ('D', 1), ('E', 0)]),
OrderedDict([('A', 1), ('B', 0), ('F', 0), ('C', 1), ('D', 0), ('E', 1)]),
OrderedDict([('A', 1), ('B', 0), ('F', 0), ('C', 1), ('D', 0), ('E', 0)]),
OrderedDict([('A', 1), ('B', 0), ('F', 0), ('C', 0), ('E', 1), ('D', 1)]),
OrderedDict([('A', 1), ('B', 0), ('F', 0), ('C', 0), ('E', 1), ('D', 0)]),
OrderedDict([('A', 1), ('B', 0), ('F', 0), ('C', 0), ('E', 0), ('D', 1)]),
OrderedDict([('A', 1), ('B', 0), ('F', 0), ('C', 0), ('E', 0), ('D', 0)])]
虽然 1= 是,0 = 否
我想以决策树格式绘制诊断图,其中每个节点都分成“是”/“否”边,这些边通向下一个节点,依此类推。
当两者都可用于同一问题时,我将“是”和“否”分组,因为它在节点上运行 使用graphviz:
u = Digraph(name, strict=True ,filename='blabla',format='png',node_attr={'color': 'mediumpurple1', 'style': 'filled'})
u.attr(size='16,16')
answer_map = ['No','Yes']
nodes = []
edges = []
for path in qa:
questions = [f'{j}_{lev}' for lev,j in enumerate(path.keys(), 1)]
questions = [w.replace(':', '_') for w in questions]
answers = [answer_map[item] for item in path.values()]
for i in range(len(questions)-1):
#u.edge(questions[i], questions[i+1],label=answers[i])
nodes.append((questions[i],questions[i+1]))
edges.append(answers[i])
d = {'nodes':nodes,'edges':edges}
df_graph = pd.DataFrame(d).drop_duplicates()
df_graph_joined = df_graph.groupby('nodes')['edges'].apply(','.join).reset_index()
for row in df_graph_joined.itertuples():
u.edge(row.nodes[0],row.nodes[1],label=row.edges)
u.render()
但是,如您所见,无法区分诊断路径。我想在每个“是”/“否”连接处拆分树,所以通过查看树我可以看到每个诊断路径。我该怎么做?
【问题讨论】:
-
我注意到这里没有问题。如果您 a) 展示您到目前为止所做的工作并且 b) 提供显示您想要的结果的图表(手绘是可以的)
-
@sroush 谢谢,我已经更新了问题,添加了代码和情节
-
请添加您尝试归档的绘图,例如手动修改提供的图纸
-
@Jens 我添加了树的绘图。谢谢。