在matplotlib中连接两个Sankey图
我正在尝试使用 matplotlib 表示一个国家的天然气平衡.
I'm trying to represent a country's gas balance using matplotlib.
我的想法是,我想使用一个Sankey绘制三种进口天然气源,并将其连接到另一个Sankey,Sankey具有其他天然气源(生产,储气库)和天然气消耗者.
The idea is that there are three sources of imported gas which I want to plot using one Sankey and connect it to another Sankey which has other sources of gas (production, gas storages) and gas consumers as outflows.
我尝试了很多次,但是我无法将两个图形连接在一起.
I tried it many times but I cannot connect two graphs together.
每个图都按设计单独绘制.但是,一旦我添加"prior = 0,connect =(3,0)"
(据称将两个图连接在一起),一切都会出错,这给了我我无法完全理解的错误.这是代码.
Each of the graphs separately plots as designed. But as soon as I add "prior=0, connect=(3,0)"
which supposedly connects two graphs together everything goes awry giving me errors which I cannot fully understand. Here is the code.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.sankey import Sankey
ImportLabels=["Imports by\nNaftogaz","Imports by\nOstchem","Imports from\nEurope", ""]
ImportFlows=[11.493,9.768,1.935,-23.196]
ImportOrientation=[0,1,-1,0]
l=["Imports","Private\nextraction","State\nextraction","Net supplies\ntoUGS","Households","TKE","Metallurgy","Energy","Other\nIndustries","Technological\nlosses"]
v=[23.196,3.968,13.998,-2.252,-13.289,-7.163,-3.487,-4.72,-7.037,-3.17]
d=[0,-1,1,-1,0,0,1,1,1,-1]
sankey=Sankey(scale=1.0/69,patchlabel="Gas balance",format='%.1f',margin=0.15)
sankey.add(flows=ImportFlows, labels=ImportLabels, orientations=ImportOrientation, label='Imports',fc='#00AF00')
sankey.add(flows=v,labels=l,orientations=d, prior=0, connect=(3,0),label='Second',fc='#008000')
想法是将第一个图的 3 个流出(具有 -23.196 的值)与第二个 sankey 的 0 个流入(也具有 23.196)连接起来
The idea is to connect 3 outflow from first graph (which has -23.196 value) with 0 inflow of the second sankey (which also has 23.196)
这是错误文本:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-24-1220fede42ce> in <module>()
14 sankey=Sankey(scale=1.0/69,patchlabel="Gas balance",format='%.1f',margin=0.15)
15 sankey.add(flows=ImportFlows, labels=ImportLabels, orientations=ImportOrientation, label='Imports',fc='#00AF00')
---> 16 sankey.add(flows=v,labels=l,orientations=d, prior=0, connect=(3,0),label='Second',fc='#008000')
C:\Python27\lib\site-packages\matplotlib\sankey.pyc in add(self, patchlabel, flows, orientations, labels, trunklength, pathlengths, prior, connect, rotation, **kwargs)
369 ("The connection index to the source diagram is %d, but "
370 "that diagram has only %d flows.\nThe index is zero-based."
--> 371 % connect[0], len(self.diagrams[prior].flows))
372 assert connect[1] < n, ("The connection index to this diagram is "
373 "%d, but this diagram has only %d flows.\n"
TypeError: not enough arguments for format string
所以我不确定两个图形之间的连接是否有问题(由sankey.pyc试图显示的文本建议)还是matplotlib本身有问题,如"TypeError:没有足够的参数用于格式字符串"
表示?
So I'm not sure Is it problem with connection between two graphs (suggested by the text the sankey.pyc is trying to display) or is it something wrong with matplotlib itself as "TypeError: not enough arguments for format string"
indicates?
您的问题是您要放置两个 .add()
调用.第一次调用 Sankey()
已经构建了一个图表(默认为灰色,有 1 个流入和 1 个流出).因此,当您尝试连接到第一个流程图时,它会失败,因为它只有一个流程,并且您试图连接到第三个流程.(无论如何它都会失败,因为流不匹配.)
Your problem is that you're putting two .add()
calls. The first call to Sankey()
already builds one diagram (default gray, with 1 inflow and 1 outflow). So when you try to connect to the first diagram, it fails because it has only one flow, and you're trying to connect to the third flow. (It would fail anyway because the flows don't match.)
您需要在第一个调用中设置第一个图,并且只有一个添加调用,例如:
You need to set up your first diagram in the first call and have only one add call, e.g.:
sankey = Sankey(scale=1.0/69,patchlabel="Gas balance",format='%.1f',margin=0.15,
flows=ImportFlows, labels=ImportLabels,
orientations=ImportOrientation, label='Imports',fc='#00AF00')
sankey.add(flows=v,labels=l,orientations=d, label='Second',fc='#008000', prior=0,
connect=(3, 0))
这给了我: