Python: построить график / распределение данных от общего количества к частям - PullRequest
0 голосов
/ 27 мая 2020

Допустим, у меня есть данные в виде

data sample

, где каждая строка представляет, как итоговое значение (83 в первом) распределяется по некоторым группам (столбцам).

Target graph

есть ли способ сгенерировать такие графики в matplotlib или в какой-либо другой библиотеке в Python? Конечным результатом должна быть последовательность графиков, подобная показанной на рисунке, уложенных горизонтально

1 Ответ

0 голосов
/ 28 мая 2020

Я предлагаю использовать для этого модуль networkx python; вы можете установить его из pip или conda следующим образом:

# pip
pip install networkx

# conda
conda install -c anaconda networkx

После установки вам необходимо использовать следующую функцию, которая возвращает график и его параметры на основе списка из трех значений в виде показано в вашем вопросе:

def create_graph(values):
    G = nx.Graph()
    G.add_edges_from([('a','b'),('a','c'), ('a','d')])
    _sum = sum(values)
    labels = {'a': _sum, 'b':values[0], 'c':values[1], 'd':values[2]}
    sizes = [50 * _sum, 50*values[0], 50*values[1], 50*values[2]]
    return G, labels, sizes

Теперь давайте посмотрим, как использовать эту функцию:

import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt

# create dummy data
df = pd.DataFrame({"A": [2, 42], "B": [41, 1], "C":[40, 27]})

# create subplot based on the number of rows in df
fig, axes = plt.subplots(nrows=df.shape[0], ncols=1, figsize=(10,10))
ax = axes.flatten()

# iterate over the rows and draw a graph for each one
for i, row in df.iterrows():
    graph, labels, sizes = create_graph(row.values)
    nx.draw(graph, node_size=sizes, labels=labels, ax=ax[i])

# show the result
plt.show()

Результатом предыдущего кода будет следующий график:

plot output

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...