Ste*_*ood 8 python tree graph python-3.x pandas
我有数据显示每个员工与其经理的关系(人:经理)-
data = {'PersonX':'Person1', 'PersonY':'Person1', 'PersonZ':'Person 2', 'Person1':'Person100','Person2':'Person100' }
Run Code Online (Sandbox Code Playgroud)
我试图在一个干净的图表中显示来自上述数据的层次结构图,如果我可以在可视化本身中过滤该数据,那就是一个奖励。
我得到的数据有时可能包含 5 个人或有时记录数超过 5000。
我已经尝试过这些方法,但它们离生成任何交互式图形还差得很远。
代码 -
尝试 1 -
import pandas as pd
import networkx as nx
d = {'PersonX': 'Person1', 'PersonY': 'Person1', 'PersonZ': 'Person2', 'Person1': 'Person100', 'Person2': 'Person100'}
df = pd.DataFrame(d.items(), columns=['Person', 'Manager'])
G = nx.from_pandas_edgelist(df, source='Person', target='Manager')
nx.draw(G, with_labels=True)
plt.show()
Run Code Online (Sandbox Code Playgroud)
尝试 2 -
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import LabelEncoder
from scipy.cluster import hierarchy
df2 = df.apply(LabelEncoder().fit_transform)
df2.set_index('Manager', inplace=True)
Z = hierarchy.linkage(df2, 'ward')
hierarchy.dendrogram(hierarchy.linkage(df2, method='ward'))
plt.show()
Run Code Online (Sandbox Code Playgroud)
尝试 3 -
print('strict digraph tree {')
for row in d.items():
print(' {0} -> {1};'.format(*row))
print('}')
Run Code Online (Sandbox Code Playgroud)
并运行了
测试.py | 点 -Tpng -otree.png
我使用以下代码创建了一个交互式图表,这是一项正在进行的工作,但我想发布它,以便人们可以在需要时使用它。
import pandas as pd
import dash
import dash_html_components as html
import dash_cytoscape as cyto
from matplotlib import colors as mcolors
from itertools import zip_longest
from ast import literal_eval
colors = dict(mcolors.BASE_COLORS, **mcolors.CSS4_COLORS)
# Sort colors by hue, saturation, value and name.
by_hsv = sorted((tuple(mcolors.rgb_to_hsv(mcolors.to_rgba(color)[:3])), name)
for name, color in colors.items())
sorted_names = [name for hsv, name in by_hsv]
app = dash.Dash(__name__)
# colors = ['red', 'blue', 'green', 'yellow', 'pink']
# stylesheet for the web page generated
default_stylesheet = [
{
"selector": 'node',
'style': {
"opacity": 0.9,
'height': 15,
'width': 15,
'background-color': '#222222',
'label': 'data(label)'
}
},
{
"selector": 'edge',
'style': {
"curve-style": "bezier",
"opacity": 0.3,
'width': 2
}
},
*[{
"selector": '.' + color,
'style': {'line-color': color}
} for color in sorted_names]
]
# Example data for illustration
# My actual data was in the excel file with two columns Managers and Person
managers = ['Person A',
'Person A',
'Person A',
'Person A',
'Person A',
'Person A',
'Person B',
'Person B',
'Person B',
'Person B',
'Person B',
'Person B',
'Person C',
'Person C',
'Person C',
'Person C',
'Person C',
'Person C',
'Person V',
'Person V',
'Person V',
'Person V',
'Person V']
person = ['Person D',
'Person E',
'Person F',
'Person G',
'Person H',
'Person I',
'Person J',
'Person K',
'Person L',
'Person M',
'Person N',
'Person O',
'Person P',
'Person Q',
'Person R',
'Person S',
'Person T',
'Person U',
'Person A',
'Person W',
'Person X',
'Person B',
'Person C']
# Creating a dataframe with the illustration data
df = pd.DataFrame(list(zip(person, managers)), columns=['Person', 'Manager'])
# Giving colors to each managers in the dataframe
df['colors'] = df['Manager'].map(dict(zip_longest(list(set(managers)), sorted_names)))
# Creating the nodes within the dataframe
df['y_node_target'] = "{\"data\": {\"id\": \"" + df['Person'] + "\", \"label\":\""+df['Person']+"\"}, \"classes\": \"" + df['colors'] + "\"}"
df['y_node'] = "{\"data\": {\"id\": \"" + df['Manager'] + "\", \"label\":\""+df['Manager']+"\"}, \"classes\": \"" + df['colors'] + "\"}"
nodes = list(set(pd.concat([df['y_node'], df['y_node_target']]).to_list()))
df['Edges'] = "{\'data\': {\'source\':\"" + df['Manager'] + "\", \'target\': \"" + df[
'Person'] + "\"},\'classes\': \"" + df['colors'] + "\"}"
# Converting the strings to dictionaries and assigning them to variables
edges = list(set(df['Edges'].astype(str).to_list()))
edges = list(map(literal_eval, edges))
nodes = list(map(literal_eval, nodes))
app.layout = html.Div([
cyto.Cytoscape(
id='cytoscape',
elements=edges + nodes,
stylesheet=default_stylesheet,
layout={
'name': 'breadthfirst'
},
style={'height': '95vh', 'width': '100%'}
)
])
if __name__ == '__main__':
app.run_server(debug=True)
Run Code Online (Sandbox Code Playgroud)
输出是一个网页 -