方法

方法

NetPlotBrain: A Python package for visualizing
networks and brains

Silvia Fanton1 and William Hedley Thompson1,2

1Department of Clinical Neuroscience, Karolinska Institutet, 斯德哥尔摩, 瑞典
2Department of Applied Information Technology, University of Gothenburg, Gothenburg, 瑞典

关键词: Network visualizations, Python, Network neuroscience, Research software

抽象的

Visualizations of networks are complex since they are multidimensional and generally convey
large amounts of information. The layout of the visualization can communicate either network
properties or spatial properties of the network. Generating such figures to effectively convey
information and be accurate can be difficult and time-consuming, and it can require expert
知识. 这里, we introduce NetPlotBrain (short for network plots onto brains), a Python
package for Python 3.9+. The package offers several advantages. 第一的, NetPlotBrain provides a
high-level interface to easily highlight and customize results of interest. 第二, it presents
a solution to promote accurate plots through its integration with TemplateFlow. 第三, 它
integrates with other Python software, allowing for easy integration to include networks from
NetworkX or implementations of network-based statistics. 总共, NetPlotBrain is a versatile
but easy to use package designed to produce high-quality network figures while integrating
with open research software for neuroimaging and network theory.

作者总结

NetPlotBrain is a Python package to easily create network visualizations on a brain
and view brain anatomy. NetPlotBrain is integrated with TemplateFlow and popular
Python packages, the former facilitating the selection of the appropriate template
or atlas from the available options and the latter providing the user with easy customization
and fine-tuning.

介绍

Visualizations in science display various types of information, ranging from theoretical models
to empirical data (Sargent, 1996). They are critical for effective communication of quantitative
信息 (Cheng et al., 2022; Tufte, 1985; van Wijk, 2006) and for facilitating the learning
of scientific information (Nolan & Perrett, 2016; Rom, 2015; Vavra et al., 2011). Visualizations
also have a crucial role in exploratory science, which is a central method to learn from data
(贝伦斯, 1997; 狐狸 & 活动, 2011; Tukey, 1977). One trend within some programmatic
visualization tools has aimed to provide users with high-level interfaces. This trend entails
that users specify and customize their plot by only pointing to the data, and the visualiza-
tion tool will then handle the rest. 或者, for low-level interfaces, users specify indi-
vidual aspects of the figure or input each variable independently. Frequently, high-level

开放访问

杂志

引文: Fanton, S。, & 汤普森, 瓦. H.
(2023). NetPlotBrain: A Python package
for visualizing networks and brains.
网络神经科学, 7(2), 461–477.
https://doi.org/10.1162/netn_a_00313

DOI:
https://doi.org/10.1162/netn_a_00313

支持信息:
https://github.com/wiheto/netplotbrain

已收到: 23 九月 2022
公认: 2 行进 2023

利益争夺: 作者有
声明不存在竞争利益
存在.

通讯作者:
William Hedley Thompson
william.hedley.thompson@gu.se

处理编辑器:
Andrew Zalesky

版权: © 2023
麻省理工学院
在知识共享下发布
归因 4.0 国际的
(抄送 4.0) 执照

麻省理工学院出版社

D

w
n

A
d
e
d

F
r


H

t
t

p

:
/
/

d

r
e
C
t
.


t
.

t

/

/

e
d

n
e
n
A
r
t

C
e

p
d

F
/

/

/

/

/

7
2
4
6
1
2
1
1
8
4
9
3
n
e
n
_
A
_
0
0
3
1
3
p
d

.

t

F


y
G

e
s
t

t


n
0
7
S
e
p
e


e
r
2
0
2
3

NetPlotBrain: A Python package for visualizing networks and brains

High-level interface:
Interaction occurs through more
abstract specification of components.
Easier to use compared with low-
level interfaces.

Data frame:
Data structured into columns and
rows, often saved as .csv or .tsv files.

NetPlotBrain:
A Python package to plot network
plots onto brains.

MatPlotLib:
A standard Python package to plot
figures.

Pandas:
A standard Python package for data
frames.

TemplateFlow:
Online repository for brain templates
that includes humans, 婴儿,
rodents, and atlases.

interfaces are implemented by inputting a data frame (IE。, a table of data with column
名字). Users then specify different column names for aspects of the figure they would like
the visualization tool to manipulate. Examples of high-level user visualization interfaces
can be seen in tools such as GGPlot2 for R (Wickham, 2016) and Seaborn for Python
(Waskom et al., 2020).

Visualizing networks is challenging because the visualization represents complex multi-
dimensional topologies embedded in the network within the two-dimensional media of a
static figure. 例如, a commonly used format in network neuroscience involves cir-
cular layouts, where all the nodes are placed in a circle. 或者, other representations
include spring, spectral, or random layouts depending on the choice of node placement
algorithm that leverages the network features such as structure. Algorithms for displaying
networks in informative ways have become a field itself (see McGuffin, 2012). 当。。。的时候
location of the nodes is important, as is often the case with brain networks, nodes are often
placed in the coordinate system corresponding to their location (例如, 大脑). 有
many tools available today to achieve these different types of visualizations. For visualizing
networks in the brain, there is BrainNet Viewer (Xia et al., 2013) and nilearn (Abraham
等人。, 2014). For general network layouts, there is Cytoscape (Smoot et al., 2011), Gephi
(Bastian et al., 2009), NetworkX (Hagberg et al., 2008), Circos (Krzywinski et al., 2009), 和
igraph (Csárdi & Nepusz, 2006). 此外, for other types of visualizations of multimodal
brain data, there are Brainrender (Claudi et al., 2021), Visbrain (Combrisson et al., 2019),
and PySurfer (https://pysurfer.github.io/).

All tools have trade-offs regarding their detail, ease of use, and suitability for certain ques-
tions and use cases. 然而, we identified three features that we would like to see within a
single tool for brain network visualizations. The tool should do the following:

(西德:129) be easy to specify and customize
(西德:129) have easy integration with software relating to neuroimaging, but also with more general

network software

(西德:129) promote the user to plot accurate templates concerning the coordinate system of the

节点

While some currently available software attempt to solve these different points to varying
degrees, we do not believe any yet sufficiently solves all three. 解决问题, 我们
developed NetPlotBrain (network plots onto brains), a Python 3.9+ 包裹. It is built on
scientific Python libraries, including Matplotlib, pandas, 和 NumPy, while also being
compatible with more specific packages such as NetworkX and other Python
implementations of network-based statistics. The high-level interface is built up as a single
function with an array to tailor the visualization to one’s needs. 最后, it leverages
TemplateFlow (Ciric et al., 2022) to provide access to a large and expanding portfolio of
brain templates and atlases, with complete provenance and versioning records that ensure
accuracy and reproducibility.

This article will proceed by introducing how to use different aspects of NetPlotBrain
(Thompson et al., 2023; https://github.com/wiheto/netplotbrain). 第一的, we discuss the
basic workflow and input of data. 第二, we discuss how figures can be customized,
interface. 第三, we show examples of how NetPlotBrain inte-
including the high-level
grates with other software. 最后,
the Methods section discusses installation and
dependencies.

网络神经科学

462

D

w
n

A
d
e
d

F
r


H

t
t

p

:
/
/

d

r
e
C
t
.


t
.

/

/

t

e
d

n
e
n
A
r
t

C
e

p
d

F
/

/

/

/

/

7
2
4
6
1
2
1
1
8
4
9
3
n
e
n
_
A
_
0
0
3
1
3
p
d

t

.

F


y
G

e
s
t

t


n
0
7
S
e
p
e


e
r
2
0
2
3

NetPlotBrain: A Python package for visualizing networks and brains

结果

Replicating programming patterns of more general-purpose visualization utilities such as
Matplotlib, the core function of NetPlotBrain’s user interface is netplotbrain.plot().

A User Interface Optimized for the Visualization of Human and Nonhuman Brain Networks

Users specify three different data inputs to display brain networks. These three inputs are (A)
the template, which specifies an anatomical image and a 3D coordinate system; (乙) the nodes,
which specify how the spatial frame established by the template is partitioned to define nodes;
和 (C) the edges, which give rise to the specific connectivity. Each of these components has a
keyword argument that can be passed:

fig, ax = netplotbrain.plot(template=…, nodes=…, edges=…).

All three arguments are optional (IE。, it is possible to plot a template by itself or just plot the

nodes by themselves). If edges are specified, the “nodes” argument must be specified.

The two outputs of the function are objects of Matplotlib classes. The first of these objects
(fig) is of the Figure class for Matplotlib. The second is a list of Matplotlib 3D axes (Axes3D) 为了
each of the subplots. These outputs allow the users to further specify low-level properties of the
plot at will with Matplotlib. 然而, the users do not need to interact with these outputs, 如果
they do not wish, as they can save the figure directly (as a .png or .svg file) in the NetPlotBrain
function using the “savename” keyword argument.

The respective input to each of these three arguments can be specified in multiple ways to
maximize flexibility. Spatial inputs (IE。, the template and the nodes) can originate locally or be
procured by TemplateFlow (Ciric et al., 2022). TemplateFlow is an online repository of MRI
atlases and templates that unambiguously names standard neuroimaging spaces and related
资源 (例如, templates and atlases). We will discuss each data component and outline how
that data can be submitted (见图 1).

D

w
n

A
d
e
d

F
r


H

t
t

p

:
/
/

d

r
e
C
t
.


t
.

t

/

/

e
d

n
e
n
A
r
t

C
e

p
d

F
/

/

/

/

/

7
2
4
6
1
2
1
1
8
4
9
3
n
e
n
_
A
_
0
0
3
1
3
p
d

t

.

The spatial reference of the visualization—the template. The template shows the brain as a
background image for the nodes and edges to be plotted onto. Its function is to help the
user see where the different nodes are located in the brain. For different purposes and
tastes, some may want a more detailed outline, while others may want just the contours
of the brain.

Primarily, the template can be specified as a string containing template names of MRI

images available on templateflow.org:

F


y
G

e
s
t

t


n
0
7
S
e
p
e


e
r
2
0
2
3

netplotbrain.plot(template=’MNI152NLin2009cAsym’).

Conveniently, the TemplateFlow client implements lazy-loading, and the template file will
be downloaded only once upon the first use onto the user’s local hard drive. NetPlotBrain will
attempt to take the most suitable anatomical image for the requested template. By default,
NetPlotBrain seeks a segmented T1w image of the brain. If that file is not present for a template
空间, then NetPlotBrain takes the binary mask of the segmented brain. Further flexibility and
options in template selection (例如, when the selected template features multiple cohorts) 是
comprehensively described in the documentation.

网络神经科学

463

NetPlotBrain: A Python package for visualizing networks and brains

D

w
n

A
d
e
d

F
r


H

t
t

p

:
/
/

d

r
e
C
t
.


t
.

/

t

/

e
d

n
e
n
A
r
t

C
e

p
d

F
/

/

/

/

/

7
2
4
6
1
2
1
1
8
4
9
3
n
e
n
_
A
_
0
0
3
1
3
p
d

t

.

F


y
G

e
s
t

t


n
0
7
S
e
p
e


e
r
2
0
2
3

数字 1. Summary of the different input formats and file locations for the different NetPlotBrain components. Information regarding templates,
节点, and edges can be provided locally or from TemplateFlow. Each of the three components can be plotted and customized independently.

或者, the template can be any skull-stripped or segmented three-dimensional NIfTI
(Neuroimaging Informatics Technology Initiative; Cox et al., 2004) image file stored locally,
specified either as a string containing the path in a file system,

netplotbrain.plot(template=’./path/to/img.nii.gz’),

or as a nibabel object,

import nibabel as nib
……
img=nib.load(’./path/to/img.nii.gz’)
netplotbrain.plot(template=img).

Python dictionary:
Data structured with key and value
对.

This alternative template specification allows, 例如, the visualization of networks
corresponding to a specific, individual brain or standard spaces defined by templates
unavailable within TemplateFlow (例如, customized, study-wise templates or templates with
reuse restrictions that cannot be shared openly).

Defining the nodes. Nodes represent the different brain regions. Nodes can be specified as a pandas
DataFrame of coordinates, a NIfTI image indicated as a string, a nibabel object stored locally, 或一个
dictionary with key/value pairs of any TemplateFlow atlas available on templateflow.org.

网络神经科学

464

NetPlotBrain: A Python package for visualizing networks and brains

When nodes are specified as a pandas DataFrame, node information should be contained

in columns ’x’, ’y’, ’z’ or identified using the “node_columnnames” argument:

import pandas as pd
……
node_df = pd.DataFrame(data={ ’x’:
’y’:
’z’:

netplotbrain.plot(nodes=nodes_df ).

[……],
[……],
[……]})

The missing input in the ’x’, ’y’, and ’z’ columns consists of lists of coordinates in the respective
template space. Additional columns in the pandas DataFrame can be added to contain additional
data to be used in the figure (see the High-level interface subsection below). The default column
names for coordinates can be changed with the “node_columnnames” keyword argument.

Nodes can also be defined by a 3D NIfTI map containing a discrete (IE。, piecewise smooth)
partition of the reference brain defined by the template. The partition is discrete because a
unique integer label identifies each node. 这里, the alternatives are similar to the local tem-
plate input, where the input is a string that designates a path to a NIfTI file,

D

w
n

A
d
e
d

F
r


H

t
t

p

:
/
/

d

r
e
C
t
.


t
.

t

/

/

e
d

n
e
n
A
r
t

C
e

p
d

F
/

/

/

/

/

7
2
4
6
1
2
1
1
8
4
9
3
n
e
n
_
A
_
0
0
3
1
3
p
d

t

.

F


y
G

e
s
t

t


n
0
7
S
e
p
e


e
r
2
0
2
3

netplotbrain.plot(nodes=’./path/to/img.nii.gz’),

or a nibabel object,

import nibabel as nib
……

img
netplotbrain.plot(nodes=img).

=

nib.load(’./path/to/img.nii.gz’)

The“nodes”argumentcanalsopointtoaTemplateFlowatlas.Anatlascanbeselectedbyspecifying
adictionaryofkeyword/valueoptionstochoosethetemplate.Forexample,thefollowingargumentsin
netplotbrain.plot will download the 400 parcel parcellation from the Schaefer2018 atlas
(Schaefer et al., 2018) in the MNI152NLin2009cAsym space from TemplateFlow:

nodes_tf = {’atlas’:

’desc’:
’resolution’: 1}.

’Schaefer2018’,
’400Parcels7Networks’,

netplotbrain.plot(template=’MNI152NLin2009cAsym’, nodes=nodes_tf ).

Connecting the nodes—the edges. Edges specify connections between nodes. Edges can be
expressed as either a NumPy array (adjacency matrix) or a pandas DataFrame (edge list).

When a NumPy array is used, the array should be N × N in shape, where N denotes the

number of nodes. The below code will plot random edges for 100 predefined nodes:

import numpy as np
……

netplotbrain.plot(nodes=nodes,

edges=edges_array),

where the edges_array variable contains a 100 × 100 NumPy array.

网络神经科学

465

NetPlotBrain: A Python package for visualizing networks and brains

When a pandas DataFrame is used, edge information should be specified in the default

columns ’i’ and ’j’, whereas ’weight’ can be an optional column for edge width.

import pandas as pd
……
edges_df = pd.DataFrame(data={’i’:
’j’:
’weight’:

netplotbrain.plot(nodes=nodes,

edges=edges_df ).

[……],
[……],
[……]}).

In edges_df, the node indices are specified as ’i’ and ’j’, and the connectivity weight is in
the optional column ’weight’. Additional columns in the data frame can further customize the
figure (see the Network Visualizations Are Highly Customizable section below). The default
column names ’i’, ’j’ can be changed with the “edge_columnnames” keyword argument.
The keyword argument “edge_weights” specifies the weight of edges.

Combining the three components. The three components are, by definition, interrelated to each
其他, with nodes being specified in the template space and edges referencing nodes. 如何-
曾经, in NetPlotBrain, each component can be specified and customized separately (看
数字 1 for a graphic of how the three components can be specified and how they combine).
注意, if using NetworkX, it is also possible to input the nodes and edges simultaneously
using the “network” keyword argument (see Integration With Other Software section below).

Network Visualizations Are Highly Customizable

The number of options to customize the figures is extensive and will not be presented in full
(see the online documentation). 这里, we will discuss four main aspects relating to customi-
扎化: (A) the naming convention of keyword arguments, (乙) the display alternatives for tem-
plates and nodes, (C) the high-level interface for specifying node or edge properties, 和 (d) 这
viewing options.

The naming convention of keyword arguments. There are a lot of possible keyword arguments that
can be used in NetPlotBrain. 一般来说, we try to preserve the option name in the software we use,
such as Matplotlib (例如, alpha for transparency). 然而, since there are multiple components,
the keyword arguments follow the following convention: _

Display alternatives for templates and nodes. All templates with NIfTI anatomical files on Tem-
plateFlow can be specified in the “template” keyword argument. A change in specification
from this single argument allows for a diverse number of templates to be shown, 包括
age ranges and species (see Figure 2A). For templates, there are different methods that generate
varying background styles. The keyword argument “template_style” governs the style.
Figure 2B illustrates four current template styles: glass, surface, filled, and cloudy.

The different templates generate approximate surfaces or plot the voxels in 3D space.
Scikit-image is used in various ways to create the styles for glass, surface, and cloudy by ren-
dering a surface or identifying borders. Additional arguments can be supplied to tweak the

网络神经科学

466

D

w
n

A
d
e
d

F
r


H

t
t

p

:
/
/

d

r
e
C
t
.


t
.

/

/

t

e
d

n
e
n
A
r
t

C
e

p
d

F
/

/

/

/

/

7
2
4
6
1
2
1
1
8
4
9
3
n
e
n
_
A
_
0
0
3
1
3
p
d

t

.

F


y
G

e
s
t

t


n
0
7
S
e
p
e


e
r
2
0
2
3

NetPlotBrain: A Python package for visualizing networks and brains

D

w
n

A
d
e
d

F
r


H

t
t

p

:
/
/

d

r
e
C
t
.


t
.

/

t

/

e
d

n
e
n
A
r
t

C
e

p
d

F
/

/

/

/

/

7
2
4
6
1
2
1
1
8
4
9
3
n
e
n
_
A
_
0
0
3
1
3
p
d

t

.

F


y
G

e
s
t

t


n
0
7
S
e
p
e


e
r
2
0
2
3

数字 2. Display options for templates. (A) A selection of options from TemplateFlow. (乙) 不同的
template styles to render the template.

surface or border generations for the skimage.segmentation.slic function, 这是
used to identify the borders in the glass template style. The filled style plots each voxel. 这
style can increase memory consumption and, 最后, reduce the rendering speed.
然而, adding the keyword argument “template_voxelsize” and specifying a higher value
than the input image will significantly increase performance. 此外, there is also the pos-
sibility of specifying hemispheres for the figure. In such instances, only the connections within
that hemisphere are shown.

For nodes, there are currently three options for node styles, which can be specified via the
“node_style” keyword argument. The first node style is circles, which plots a circle marker.
The second is spheres, which generates a 3D sphere in the image. The third is parcels, 哪个,
using scikit-image, generates a surface per parcel (见图 3).

数字 3. Display options for nodes. The figure shows the same 100 nodes plotted as circles,
spheres, and parcels. If the parcels option is chosen, the nodes need to be specified using a NIfTI
图像.

网络神经科学

467

NetPlotBrain: A Python package for visualizing networks and brains

For edges, straight lines are drawn between the nodes’ centroids. Properties of the edges,

such as size and color, can be specified (see the next section).

High-level interface. This section will demonstrate how our high-level interface has been designed
to easily specify different properties in the figure. This interface entails that data that specify figure
properties can be additional columns in the node or edge input data frames. 例如, 网络
measures for both nodes and edges could be included in the data frame and used to set the color,
shape, highlighting, 等等. 因此, the input data frame for nodes or edges could be the following:

[……],
nodes_df = pd.DataFrame(data={’x’:
[……],
’y’:
[……],
’z’:
’community’:
……],
’participation_coef’: [0.5, 0.2, 0.8, ……]}).
[……],
[……],
[……],

edges_df = pd.DataFrame(data={’i’:
’j’:
’weight’:

[1,

1,

2

’edge_betweenness’: [0.3, 0.1, 0.9,……]}).

It is then possible to specify properties such as color, 尺寸, and highlighting. This feature
entails having to specify only the column name for the property. 例如, the code to
specify the size of nodes by the “participation_coef” and color it by the “community” is the
following:

netplotbrain.plot(nodes=nodes_df,

node_color=’community’,
node_size= participation_coef’).

见图 4 for a minimal example of how to easily color and resize a subset of nodes
based on the nodal information stored in the pandas DataFrame. 见图 6 for an
example of the highlighting functionality.

此外, suppose nodes are specified with an argument that is not a data frame (例如,
a dictionary to specify a TemplateFlow atlas). In that case, it is possible to add additional
information about the nodes or edges using the keyword arguments “nodes_df” or
“edges_df”:

D

w
n

A
d
e
d

F
r


H

t
t

p

:
/
/

d

r
e
C
t
.


t
.

/

/

t

e
d

n
e
n
A
r
t

C
e

p
d

F
/

/

/

/

/

7
2
4
6
1
2
1
1
8
4
9
3
n
e
n
_
A
_
0
0
3
1
3
p
d

.

t

F


y
G

e
s
t

t


n
0
7
S
e
p
e


e
r
2
0
2
3

nodes_tf = {’template’:

’atlas’:
’desc’:
’resolution’:
nodes_df = pd.DataFrame(data={’community’:

’MNI152NLin2009cAsym’,
’Schaefer2018’,
’400Parcels7Networks’,

[1, 1, 2 ……],

1}

netplotbrain.plot(nodes=nodes_tf,

nodes_df=nodes_df ).

’participation_coef’: [0.5, 0.2, 0.8, ……]})

Viewing options. NetPlotBrain’s intended use is to generate multiple subplots of the same brain
for display purposes (例如, in journals) rather than to provide an interactive interface.

网络神经科学

468

NetPlotBrain: A Python package for visualizing networks and brains

D

w
n

A
d
e
d

F
r


H

t
t

p

:
/
/

d

r
e
C
t
.


t
.

/

t

/

e
d

n
e
n
A
r
t

C
e

p
d

F
/

/

/

/

/

7
2
4
6
1
2
1
1
8
4
9
3
n
e
n
_
A
_
0
0
3
1
3
p
d

.

t

F


y
G

e
s
t

t


n
0
7
S
e
p
e


e
r
2
0
2
3

数字 4. Minimal example showing the high-level interaction with data frame input to customize. The top left area shows
code that first loads a .csv file and then calls netplotbrain.plot, passing in information about the nodes. The top right
area shows the first few lines of the .csv file, illustrating the mandatory ‘x’, ‘y’, and ‘z’ coordinate columns but also additional
measures “Measure-1” and “Measure-2” (例如, centrality measures) as well as “Community” (the community affiliation). 这
bottom of the figure shows how the high-level interface works by calling the column names in the loaded .csv file. The code
snippets above each figure show what is added to the top left code snippet to change the figure. Figure legends are automat-
ically generated.

Teoretically, the figures can be manually rotated, but this is often sluggish using Matplotlib.
因此, NetPlotBrain is designed to generate multiple panels of the figure from different viewing
angles. There are multiple ways this can be specified:

1. Prespecifying viewing angles and combinations of angles
2. Generating a series of rotating images between two views
3. Specifying the angle and elevation

As for prespecified viewing angles and combinations of angles, these include single letters,
combinations of letters for multiple plots, or preset combinations. The available letter alterna-
tives that assign the angles are the following:

’S’: superior
’I’: inferior
’P’: 后部
’A’: 前部
’L’: 左边
’R’: 正确的
’s’: spring layout (See the Integration With Other Software section below for more about this
option.)

Spring layout:
A type of network visualization.

网络神经科学

469

NetPlotBrain: A Python package for visualizing networks and brains

例如, to view an image from the anterior perspective, the letter “A” can be

假如:

netplotbrain.plot(template=…,

nodes=…,
edges=…,
view=’A’).

或者, for the superior preset angle, the letter “S” can be provided:

netplotbrain.plot(template=…,

nodes=…,
edges=…,
view=’S’).

A string of multiple letters can also be specified to generate multiple subplots. 例如,

the following will generate three panels (IE。, 左边, superior, and right preset angles):

netplotbrain.plot(template=…,

nodes=…,
edges=…,
view=’LSR’).

最后, generating multiple rows of subplots is possible by specifying a list of preset angles.

例如, the following will generate two rows and three columns of figures:

netplotbrain.plot(template=…,

nodes=…,
edges=…,
view=[’LSR’, ’AIP’]).

There are also six combinations of different viewing angles that can all be specified using

the string “preset-”:

netplotbrain.plot(template=…,

nodes=…,
edges=…,
view=’preset-6’).

See Figure 5A and 5B for examples of the different views. 参见https://netplotbrain.org/preset

for all the preset angle combination alternatives.

The second way to define views is to specify two preset views (例如, view = ’AP’) 在那里-
after specify a “frames” keyword argument, which will define how many subplots will be gen-
erated, rotating between the two specified views:

netplotbrain.plot(template=…,

nodes=…,
edges=…,
view=’AP’,
frames=3).

网络神经科学

470

D

w
n

A
d
e
d

F
r


H

t
t

p

:
/
/

d

r
e
C
t
.


t
.

/

/

t

e
d

n
e
n
A
r
t

C
e

p
d

F
/

/

/

/

/

7
2
4
6
1
2
1
1
8
4
9
3
n
e
n
_
A
_
0
0
3
1
3
p
d

t

.

F


y
G

e
s
t

t


n
0
7
S
e
p
e


e
r
2
0
2
3

NetPlotBrain: A Python package for visualizing networks and brains

D

w
n

A
d
e
d

F
r


H

t
t

p

:
/
/

d

r
e
C
t
.


t
.

/

t

/

e
d

n
e
n
A
r
t

C
e

p
d

F
/

/

/

/

/

7
2
4
6
1
2
1
1
8
4
9
3
n
e
n
_
A
_
0
0
3
1
3
p
d

.

t

F


y
G

e
s
t

t


n
0
7
S
e
p
e


e
r
2
0
2
3

数字 5. Examples of different views. (A) Multi-panel preset of six different viewing angles (view = ’preset-6’). (乙) Same as panel A but for four
viewing angles (view = ’preset-4’). (C) Anterior-view to posterior-view rotating for four frames. (D) Same as panel C but for five frames.

Figure 5C and 5D show the difference between specifying four and five rotating frames.

The final viewing version is to specify the rotation (along the XY axis) and the elevation
(along the XZ axis) as a 2-tuple. This option is useful only when wanting to capture a default
angle outside of the preset angles.

此外, while NetPlotBrain aims to be simple to use with a single plot function, 许多
visualization options are available. We have documented all the options at https://netplotbrain
.org/api and placed them in different categories to assist in finding the correct keyword argu-
蒙特. 最后, we have placed many figures in the netplotbrain.org/gallery to provide the users
with examples of the different possibilities.

Integration With Other Software

在这个部分, we discuss the TemplateFlow integration advantages and detail two additional
ways other software can integrate with NetPlotBrain.

The TemplateFlow integration promotes the usage of consistent spaces in the figure. In pre-
vious sections, we have discussed how this integration occurs, but here we will detail the ben-
收益. Ciric et al. (2022) argue that, in many neuroimaging articles, authors have not been

网络神经科学

471

NetPlotBrain: A Python package for visualizing networks and brains

D

w
n

A
d
e
d

F
r


H

t
t

p

:
/
/

d

r
e
C
t
.


t
.

/

t

/

e
d

n
e
n
A
r
t

C
e

p
d

F
/

数字 6. Example of the highlighting functionality. (A) An example of how to easily add a spring layout plot containing all the high-level
interface features. 在这个例子中, the “view” keyword argument is ’LSs’. (乙) An example of the highlighting of clusters of edges that were
重要的. The code for both examples can be found on netplotbrain.org/gallery.

/

/

/

/

7
2
4
6
1
2
1
1
8
4
9
3
n
e
n
_
A
_
0
0
3
1
3
p
d

t

.

F


y
G

e
s
t

t


n
0
7
S
e
p
e


e
r
2
0
2
3

precise in specifying which template they have used and have been reporting vague phrases
such as “in MNI space” instead. Given the ambiguity in reporting the methods, it is likely and
understandable that researchers have inadvertently plotted incorrect nodes or background
templates in their network visualizations. This integration means that the nodes may have
come from one MNI space and the template from another. There are generally no checks to
ensure that the correct background template is in the same space as the nodes. Guidelines for
well-designed user interfaces, including preventing the user from making errors (Mazumder &
这, 2014), have been considered in NetPlotBrain. Our solution to minimize possible user
error is to utilize TemplateFlow’s API in the background to find the background templates
and atlases. Instead of including a default template, the user must know which template they
used and specify it. This implementation encourages the user to provide the correct input with-
out the required expert knowledge to make the correct decision. 然而, this design choice
does not impact the learning curve too much, as output in BIDS derivatives from preprocessing
软件, such as fMRIPrep (Esteban et al., 2019), includes the template space name in the
preprocessed data’s file names. 因此, we believe that NetPlotBrain promotes accuracy by strik-
ing a good balance between usability and required knowledge.

In addition to TemplateFlow, NetPlotBrain supports two additional software packages:
NetworkX (Hagberg et al., 2008) and network-based statistics (NBS; Zalesky et al., 2010).
NetworkX can specify the nodes, 边缘, and their respective network properties. 这

网络神经科学

472

NetPlotBrain: A Python package for visualizing networks and brains

integration with NetworkX is twofold. 第一的, it is possible to input a NetworkX network (a Graph
目的) to NetPlotBrain that contains the nodes and edges information. 要做到这一点, 这
“network” keyword argument is used:

nx_network = nx.Graph(……)
netplotbrain.plot(template=…,

network=nx_network).

For this approach to be successful, the Graph object needs to have the node attributes x, y,
z (or different attributes, if passing a “node_columnnames” keyword argument). Any other
attribute in the nx.Graph object can be used in the high-level interface (see Figure 6A).

The second integration with NetworkX is its implementation of spring layout figures by
entering a lowercase “s” as a value passed to the “view” keyword argument. This argument
will create an additional subpanel and plot a spring layout figure with all the size, 颜色, 和
highlight features preserved. This integration allows the figure to include brain and spring lay-
outs with the same color and size specifications (see Figure 6A and netplotbrain.org/gallery
/spring_layout for a code example).

Another current integration is with Python implementations of network-based statistics.
NBS is a common way to identify the presence of significant clusters (Zalesky et al., 2010).
Python implementations of NBS can be found in pybct, the Python implementation of the
Brain Connectivity Toolbox. With the output from the NBS functions being passed to the “high-
light_edges” keyword argument, the significant clusters of the network can be easily visualized
(see Figure 6B and netplotbrain.org/gallery/nbs for a code example).

Additional integrations with other software and specifications will be added over time. 一
example is the connectivity matrix BIDS specification that is currently being drafted. 一次
finalized, additions to NetPlotBrain can include ways to plot group averages or differences
by specifying only the relevant derivatives directory.

D

w
n

A
d
e
d

F
r


H

t
t

p

:
/
/

d

r
e
C
t
.


t
.

/

/

t

e
d

n
e
n
A
r
t

C
e

p
d

F
/

/

/

/

/

7
2
4
6
1
2
1
1
8
4
9
3
n
e
n
_
A
_
0
0
3
1
3
p
d

.

t

F


y
G

e
s
t

t


n
0
7
S
e
p
e


e
r
2
0
2
3

讨论

NetPlotBrain is a visualization tool developed in Python 3.9+ to plot networks onto a brain.
The main benefits of NetPlotBrain are (A) being easy to use while offering a wide array of cus-
tomization options, by means of its high-level interface; (乙) ensuring the accuracy of plots
using its integration with TemplateFlow (Ciric et al., 2022); 和 (C) being integrated with other
network infrastructures for neuroimaging and Python, such as NetworkX and pyBCT’s imple-
mentation of network-based statistics. One additional advantage of NetPlotBrain’s integration
with TemplateFlow (Ciric et al., 2022) is that when new templates and atlases are added to
TemplateFlow over time, they become immediately available for visualizing in NetPlotBrain.

As discussed in the Introduction, plotting networks can be difficult. With NetPlotBrain, A
wide number of network-related plots can be generated for a wide variety of use cases. 这些
uses include (but are not exclusive to) displaying a parcellation, showing an entire connectivity
matrix on the brain, showing the edges of a single community, highlighting results based on
network theory measures, highlighting nodes of interest (例如, seed regions), showing seed-seed
连接性, displaying significant clusters, plotting differences between groups, conducting
exploratory studies, and pairing results both on spatial coordinates and on spring layout figures.

On the documentation page of NetPlotBrain (https://netplotbrain.org), there is a gallery of
different plots that can currently be created using NetPlotBrain. Each example leads to a

网络神经科学

473

NetPlotBrain: A Python package for visualizing networks and brains

notebook of how to create these plots. At the top of each notebook, there is a link to open the
document in an interactive notebook on mybinder.org to allow users to interact with the
examples.

While NetPlotBrain assists researchers to easily create high-quality visualizations, clearly
communicating the intended message can still require tweaking and consideration. 为了
例子, the plots in Figure 5 and Figure 6A are not constructed to convey information about
any systematic pattern in the edges but rather to demonstrate different visualization options.
Edge information on such figures can be hard to interpret, which is one of the reasons why we
have added the option to highlight nodes and edges (例如, Figure 6B). Creating the clearest
desired figures may require considering how to utilize the different visualization arguments
in NetPlotBrain. 总共, while the figures can be easily created, some care is still needed from
the user in order to communicate the intended message to the readers.

Limitations

NetPlotBrain has been conceived as an effective tool for network neuroscience communica-
的, mostly to generate static figures inserted in scientific manuscripts or presentations. 那里-
fore, the design has not considered user-controlled rotation of the figure as a feature. 我们
would recommend visualizing multiple subplots instead of rotating the figure.

此外, the current version of NetPlotBrain renders only NIfTI files. This current
limitation entails that surfaces (例如, GIFTI or CIFTI file formats) cannot be specified. 然而,
this feature will be implemented in a later version. Since later versions of the software will add
support for additional file formats after print, an up-to-date table of the features available in
NetPlotBrain is available at https://www.netplotbrain.org/features/.

方法

Installation

NetPlotBrain can be installed from PyPi with

pip install netplotbrain

or directly from https://github.com/wiheto/netplotbrain (Thompson et al., 2023) to update to
the latest development version. It is recommended to have at least 2 GB RAM to use
NetPlotBrain effectively.

NetPlotBrain Dependencies

NetPlotBrain is written in Python 3.9.x+ and utilizes TemplateFlow (Ciric et al., 2022), Mat-
plotlib (猎人, 2007), pandas (McKinney, 日期不详。), NumPy (Harris et al., 2020), scipy (哈里斯
等人。, 2020), nibabel (布雷特等人。, 2020), NetworkX (Hagberg et al., 2008), scikit-image (van
der Walt et al., 2014), and PIL (克拉克, 2015).

Workflow

Using NetPlotBrain requires only the netplotbrain.plot function. This function takes in
information from up to three sources: the template, the nodes, and the edges. The high-level
interface allows each component to be tweaked and customized to display the information
需要的 (例如, node size, 颜色, or highlighting of significant clusters).

网络神经科学

474

D

w
n

A
d
e
d

F
r


H

t
t

p

:
/
/

d

r
e
C
t
.


t
.

/

/

t

e
d

n
e
n
A
r
t

C
e

p
d

F
/

/

/

/

/

7
2
4
6
1
2
1
1
8
4
9
3
n
e
n
_
A
_
0
0
3
1
3
p
d

t

.

F


y
G

e
s
t

t


n
0
7
S
e
p
e


e
r
2
0
2
3

NetPlotBrain: A Python package for visualizing networks and brains

Data Used

Our examples use the data available on TemplateFlow (Ciric et al., 2022), 包括
Schaefer atlas (Schaefer et al., 2018) and the Yeo 7 community assignments (Yeo et al.,
2011). Aside from this, all data included in the examples are either random or pseudorandom.
The code used to create data is included in the scripts and the pseudo data are included in
the NetPlotBrain package.

Code Examples in the Text

All code examples assume that NetPlotBrain has been imported (IE。, import netplot-
brain has been run). Whenever “…” is included, that indicates some missing code not
directly relevant to the point being made in the example. If a certain part of the code is critical
for the example, it is presented in bold. 更远, in the main text, keyword arguments are
encased in double quotation marks. Input values to keyword arguments are encased in single
quotation marks.

致谢

We would like to thank Oscar Esteban for providing valuable comments on an early draft of
the manuscript.

DATA AND SOFTWARE AVAILABILITY

NetPlotBrain was developed as an open-source software released under Apache 2 执照. 这
code used to plot the figures shown or mentioned above can be found at https://github.com
/silviafan/netplotbrain-figures (for the figures in this article) or/and https://netplotbrain.org
/gallery/ (for updated documentation).

作者贡献

Silvia Fanton: 软件; 可视化; Writing – original draft; 写作——复习 & 编辑. 威廉
Hedley Thompson: 概念化; 方法; 项目管理; 软件; Super-
想象; 可视化; Writing – original draft; 写作——复习 & 编辑.

资金信息

Silvia Fanton, European Union’s Horizon 2020 research and innovation programme under the
Marie Skłodowska-Curie Grant Agreement (https://dx.doi.org/10.13039/100018694), 奖
ID: 764860.

参考

Abraham, A。, Pedregosa, F。, Eickenberg, M。, Gervais, P。, Mueller,
A。, Kossaifi, J。, Gramfort, A。, Thirion, B., & Varoquaux, G.
(2014). Machine learning for neuroimaging with scikit-learn.
神经信息学前沿, 8, 14. https://doi.org/10.3389
/fninf.2014.00014, 考研: 24600388

Bastian, M。, Heymann, S。, & Jacomy, 中号. (2009). Gephi: An open
source software for exploring and manipulating networks. Pro-
ceedings of the International AAAI Conference on Web and

Social Media, 3(1), 361–362. https://doi.org/10.1609/icwsm
.v3i1.13937

贝伦斯, J. 时间. (1997). Principles and procedures of exploratory data
分析. Psychological Methods, 2(2), 131–160. https://doi.org
/10.1037/1082-989X.2.2.131

Brett, M。, Markiewicz, C. J。, Hanke, M。, Côté, M.-A., Cipollini, B.,
麦卡锡, P。, Jarecka, D ., Cheng, C. P。, Halchenko, 是. 奥。,
Cottaar, M。, 拉森, E., 戈什, S。, Wassermann, D ., Gerhard,

网络神经科学

475

D

w
n

A
d
e
d

F
r


H

t
t

p

:
/
/

d

r
e
C
t
.


t
.

t

/

/

e
d

n
e
n
A
r
t

C
e

p
d

F
/

/

/

/

/

7
2
4
6
1
2
1
1
8
4
9
3
n
e
n
_
A
_
0
0
3
1
3
p
d

.

t

F


y
G

e
s
t

t


n
0
7
S
e
p
e


e
r
2
0
2
3

NetPlotBrain: A Python package for visualizing networks and brains

S。, 李, G. R。, 王, H.-T., Kastman, E., Kaczmarzyk, J。,
Guidotti, R。, … freec84. (2020). Nipy/nibabel: 3.2.1. Zenodo.
https://doi.org/10.5281/zenodo.4295521

Cheng, K., 陈, Y。, 拉森, K., & Rolandi, 中号. (2022). Proving the
value of visual design in scientific communication. 信息
Design Journal, 23(1), 80–95. https://doi.org/10.1075/idj.23.1
.09che

Ciric, R。, 汤普森, W., Lorenz, R。, Goncalves, M。, MacNicol, E.,
Markiewicz, C。, Halchenko, Y。, 戈什, S。, Gorgolewski, K.,
Poldrack, R。, & Esteban, 氧. (2022). TemplateFlow: FAIR-sharing of
multi-scale, multi-species brain models. Nature Methods, 19(12),
1568–1571. https://doi.org/10.1038/s41592-022-01681-2,
考研: 36456786

Krzywinski, M。, Schein, J。, Birol, İ., Connors, J。, Gascoyne, R。,
Horsman, D ., 琼斯, S. J。, & Marra, 中号. A. (2009). Circos: An infor-
mation aesthetic for comparative genomics. Genome Research,
19(9), 1639–1645. https://doi.org/10.1101/gr.092759.109,
考研: 19541911

Mazumder, F. K., & 这, U. K. (2014). Usability guidelines for
usable user interface. International Journal of Research in Engi-
neering and Technology, 3(9), 79–82. https://doi.org/10.15623
/ijret.2014.0309011

McGuffin, 中号. J. (2012). Simple algorithms for network visualization:
A tutorial. Tsinghua Science and Technology, 17(4), 383–398.
https://doi.org/10.1109/TST.2012.6297585

McKinney, 瓦. (日期不详。). Pandas: A foundational Python library for data

克拉克, A. (2015). Pillow (PIL Fork) documentation. https://doi.org/10

analysis and statistics.

.5281/zenodo.59651

Claudi, F。, Tyson, A. L。, Petrucco, L。, Margrie, 时间. W., Portugues, R。,
& Branco, 时间. (2021). Visualizing anatomically registered data
with brainrender. 电子生活, 10, e65751. https://doi.org/10.7554
/eLife.65751, 考研: 33739286

Combrisson, E., Vallat, R。, O’Reilly, C。, Jas, M。, Pascarella, A。,
Saive, A。, Thiery, T。, 莫尼耶, D ., Altukhov, D ., Lajnef, T。, Ruby,
P。, Guillot, A。, & Jerbi, K. (2019). Visbrain: A multi-purpose
GPU-accelerated open-source suite for multimodal brain data
可视化. 神经信息学前沿, 13, 14. https://土井
.org/10.3389/fninf.2019.00014, 考研: 30967769

考克斯, 右. W., Ashburner, J。, Breman, H。, Fissell, K., 哈塞尔格罗夫, C。,
Holmes, C. J。, 兰卡斯特, J. L。, Rex, D. E., 史密斯, S. M。, 伍德沃德,
J. B., & Strother, S. C. (2004). A (sort of ) new image data format
标准: NIfTI-1. 10th Annual Meeting of the Organization for
人脑图谱. 布达佩斯, 匈牙利.

Csárdi, G。, & Nepusz, 时间. (2006). The igraph software package for
complex network research. InterJournal Complex Systems,
1695(5), 1–9.

Esteban, 奥。, Markiewicz, C. J。, 布莱尔, 右. W., Moodie, C. A。, Ilkay, A。,
Erramuzpe, A。, Kent, J. D ., Goncalves, M。, Dupre, E., 斯奈德, M。,
Oya, H。, 戈什, S. S。, 赖特, J。, Durnez, J。, Poldrack, 右. A。, &
Gorgolewski, K. J. (2019). fMRIPrep: A robust preprocessing
pipeline for functional MRI. Nature Methods, 16(1), 111–116.
https://doi.org/10.1038/s41592-018-0235-4 , 考研:
30532080

狐狸, P。, & 活动, J. (2011). Changing the equation on scientific
data visualization. 科学, 331(6018), 705–708. https://doi.org
/10.1126/science.1197654, 考研: 21311008

Hagberg, A. A。, Schult, D. A。, & Swart, 磷. J. (2008). Exploring net-
work structure, dynamics, and function using NetworkX. Pro-
ceedings of the 7th Python in Science Conference (SciPy2008),
836, 11–15. https://www.osti.gov/energycitations/product.biblio
.jsp?osti_id=960616

哈里斯, C. R。, Millman, K. J。, van der Walt, S. J。, Gommers, R。,
Virtanen, P。, Cournapeau, D ., Wieser, E., 泰勒, J。, 伯格, S。,
史密斯, 氮. J。, Kern, R。, Picus, M。, Hoyer, S。, van Kerkwijk,
中号. H。, Brett, M。, Haldane, A。, del Río, J. F。, Wiebe, M。, 彼得森,
P。, … Oliphant, 时间. 乙. (2020). Array programming with NumPy.
自然, 585(7825), 357–362. https://doi.org/10.1038/s41586
-020-2649-2, 考研: 32939066

猎人, J. D. (2007). Matplotlib: A 2D graphics environment. 康姆-
puting in Science and Engineering, 9(3), 99–104. https://doi.org
/10.1109/MCSE.2007.55

Nolan, D ., & Perrett, J. (2016). Teaching and learning data visuali-
扎化: Ideas and assignments. The American Statistician, 70(3),
260–269. https://doi.org/10.1080/00031305.2015.1123651
Rom, 中号. C. (2015). Numbers, pictures, 和政治: Teaching
research methods through data visualizations. Journal of Political
Science Education, 11(1), 11–27. https://doi.org/10.1080
/15512169.2014.985108

Sargent, 磷. (1996). On the use of visualizations in the practice of
科学. Philosophy of Science, 63, S230–S238. https://doi.org
/10.1086/289956

Schaefer, A。, 孔, R。, Gordon, 乙. M。, 劳曼, 时间. 奥。, Zuo,
(2018).
X.-N., Holmes, A。, Eickhoff, S. B., & 杨, 乙. 时间. 时间.
the human cerebral cortex from
Local-global parcellation of
intrinsic functional connectivity MRI. 大脑皮层, 28(9),
3095–3114. https://doi.org/10.1093/cercor/bhx179, 考研:
28981612

Smoot, 中号. E., Ono, K., Ruscheinski, J。, 王, P.-L., & Ideker, 时间.
(2011). Cytoscape 2.8: New features for data integration and net-
work visualization. Bioinformatics, 27(3), 431–432. https://土井
.org/10.1093/bioinformatics/btq675, 考研: 21149340

汤普森, 瓦. H。, Fanton, S。, & Gadde, S. (2023). NetPlotBrain,

GitHub. https://github.com/wiheto/netplotbrain

Tufte, 乙. 右. (1985). The visual display of quantitative information.
Journal for Healthcare Quality, 7(3), 15. https://doi.org/10.1097
/01445442-198507000-00012

Tukey, J. 瓦. (1977). Exploratory data analysis. Addison-Wesley.
van der Walt, S。, Schönberger, J. L。, Nunez-Iglesias, J。, Boulogne, F。,
华纳, J. D ., Yager, N。, Gouillart, E., & 于, 时间. (2014). Scikit-
图像: Image processing in Python. 同行杂志, 2, e453. https://土井
.org/10.7717/peerj.453, 考研: 25024921

van Wijk, J. J. (2006). Views on visualization. IEEE Transactions on
Visualization and Computer Graphics, 12(4), 421–432. https://
doi.org/10.1109/TVCG.2006.80, 考研: 16805253

Vavra, K. L。, Janjic-Watrich, 五、, Loerke, K., Phillips, L. M。, Norris,
S. P。, & Macnab, J. (2011). Visualization in science education.
Alberta Science Education Journal, 41(1), 22–30.

Waskom, M。, Botvinnik, 奥。, Ostblom, J。, Gelbart, M。, Lukauskas, S。,
Hobson, P。, Gemperline, D. C。, Augspurger, T。, Halchenko, Y。,
Cole, J. B., Warmenhoven, J。, de Ruiter, J。, Pye, C。, Hoyer, S。,
Vanderplas, J。, Villalba, S。, Kunter, G。, Quintero, E., Bachant,
P。, … Fitzgerald, C. (2020). Mwaskom/seaborn: V0.10.1 (四月
2020). Zenodo.

Wickham, H. (2016). 数据分析. In ggplot2 (PP. 189–201).

施普林格. https://doi.org/10.1007/978-3-319-24277-4_9

网络神经科学

476

D

w
n

A
d
e
d

F
r


H

t
t

p

:
/
/

d

r
e
C
t
.


t
.

/

t

/

e
d

n
e
n
A
r
t

C
e

p
d

F
/

/

/

/

/

7
2
4
6
1
2
1
1
8
4
9
3
n
e
n
_
A
_
0
0
3
1
3
p
d

t

.

F


y
G

e
s
t

t


n
0
7
S
e
p
e


e
r
2
0
2
3

NetPlotBrain: A Python package for visualizing networks and brains

Xia, M。, 王, J。, & 他, 是. (2013). BrainNet Viewer: A network
visualization tool for human brain connectomics. PLOS ONE,
8(7), e68910. https://doi.org/10.1371/journal.pone.0068910,
考研: 23861951

杨, 乙. 时间. T。, 克里宁, F。, 墓, J。, 肥皂, M。, Lashkar, D .,
霍林斯黑德, M。, 罗夫曼, J。, 斯莫勒, J。, 佐莱伊, L。, 波利梅尼, J。,
菲舍尔, B., 刘, H。, & 巴克纳, 右. L. (2011). The organization of

the human cerebral cortex estimated by intrinsic functional con-
nectivity. 神经生理学杂志, 106(3), 1125–1165.
https://doi.org/10.1152/jn.00338.2011, 考研: 21653723

扎莱斯基, A。, 假如, A。, & 布莫尔, 乙. 时间. (2010). 基于网络
statistic: Identifying differences in brain networks. 神经影像,
53(4), 1197–1207. https://doi.org/10.1016/j.neuroimage.2010
.06.041, 考研: 20600983

D

w
n

A
d
e
d

F
r


H

t
t

p

:
/
/

d

r
e
C
t
.


t
.

t

/

/

e
d

n
e
n
A
r
t

C
e

p
d

F
/

/

/

/

/

7
2
4
6
1
2
1
1
8
4
9
3
n
e
n
_
A
_
0
0
3
1
3
p
d

.

t

F


y
G

e
s
t

t


n
0
7
S
e
p
e


e
r
2
0
2
3

网络神经科学

477METHODS image
METHODS image
METHODS image
METHODS image
METHODS image
METHODS image
METHODS image
METHODS image

下载pdf