Skip to content

Commit b49ad2c

Browse files
authored
Merge pull request #950 from compas-dev/plotter-labels
Some plotter fixes
2 parents e7d0ebe + 615dcb5 commit b49ad2c

File tree

6 files changed

+137
-17
lines changed

6 files changed

+137
-17
lines changed

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99

1010
### Added
1111

12+
* Added `compas_plotters.artists.NetworkArtist.draw_nodelabels`.
13+
* Added `compas_plotters.artists.NetworkArtist.draw_edgelabels`.
14+
* Added `compas_plotters.Plotter.fontsize`.
15+
1216
### Changed
1317

18+
* Fixed bug in inheritance of `compas_plotters.artists.NetworkArtist`.
19+
* Changed `compas_plotters.artists.MeshArtist.draw_edges` to ignore edge direction for assignment of edge colors and widths.
20+
* Changed `compas_plotters.artists.MeshArtist.draw_vertexlabels` to use `compas_plotters.Plotter.fontsize`.
21+
* Changed `compas_plotters.artists.MeshArtist.draw_edgelabels` to use `compas_plotters.Plotter.fontsize`.
22+
* Changed `compas_plotters.artists.MeshArtist.draw_facelabels` to use `compas_plotters.Plotter.fontsize`.
23+
1424
### Removed
1525

1626

src/compas/artists/networkartist.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class NetworkArtist(Artist):
6060
default_edgewidth = 1.0
6161

6262
def __init__(self, network, **kwargs):
63-
super(NetworkArtist, self).__init__(**kwargs)
63+
super(NetworkArtist, self).__init__()
6464

6565
self._network = None
6666
self._nodes = None
@@ -133,15 +133,15 @@ def node_color(self, node_color):
133133
@property
134134
def node_size(self):
135135
if not self._node_size:
136-
self._node_size = {node: self.default_nodesize for node in self.network.vertices()}
136+
self._node_size = {node: self.default_nodesize for node in self.network.nodes()}
137137
return self._node_size
138138

139139
@node_size.setter
140140
def node_size(self, nodesize):
141141
if isinstance(nodesize, dict):
142142
self._node_size = nodesize
143143
elif isinstance(nodesize, (int, float)):
144-
self._node_size = {node: nodesize for node in self.network.vertices()}
144+
self._node_size = {node: nodesize for node in self.network.nodes()}
145145

146146
@property
147147
def edge_color(self):

src/compas/artists/volmeshartist.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ class VolMeshArtist(Artist):
8383
default_cellcolor = (1, 0, 0)
8484

8585
def __init__(self, volmesh, **kwargs):
86-
super(VolMeshArtist, self).__init__(**kwargs)
86+
super(VolMeshArtist, self).__init__()
8787
self._volmesh = None
8888
self._vertices = None
8989
self._edges = None

src/compas_plotters/artists/meshartist.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -316,9 +316,10 @@ def draw_edges(self,
316316
colors = []
317317
widths = []
318318
for edge in self.edges:
319+
u, v = edge
319320
lines.append([self.vertex_xyz[edge[0]][:2], self.vertex_xyz[edge[1]][:2]])
320-
colors.append(self.edge_color.get(edge, self.default_edgecolor))
321-
widths.append(self.edge_width.get(edge, self.default_edgewidth))
321+
colors.append(self.edge_color.get(edge, self.edge_color.get((v, u), self.default_edgecolor)))
322+
widths.append(self.edge_width.get(edge, self.edge_width.get((v, u), self.default_edgewidth)))
322323

323324
collection = LineCollection(
324325
lines,
@@ -468,7 +469,7 @@ def draw_vertexlabels(self, text: Optional[Dict[int, str]] = None) -> None:
468469
artist = self.plotter.axes.text(
469470
x, y,
470471
f'{text}',
471-
fontsize=12,
472+
fontsize=self.plotter.fontsize,
472473
family='monospace',
473474
ha='center', va='center',
474475
zorder=10000,
@@ -499,7 +500,8 @@ def draw_edgelabels(self, text: Optional[Dict[int, str]] = None) -> None:
499500

500501
labels = []
501502
for edge in self.edges:
502-
text = self.edge_text.get(edge, None)
503+
u, v = edge
504+
text = self.edge_text.get(edge, self.edge_text.get((v, u), None))
503505
if text is None:
504506
continue
505507

@@ -510,7 +512,7 @@ def draw_edgelabels(self, text: Optional[Dict[int, str]] = None) -> None:
510512

511513
artist = self.plotter.axes.text(
512514
x, y, f'{text}',
513-
fontsize=12,
515+
fontsize=self.plotter.fontsize,
514516
family='monospace',
515517
ha='center', va='center',
516518
zorder=10000,
@@ -550,7 +552,7 @@ def draw_facelabels(self, text: Optional[Dict[int, str]] = None) -> None:
550552

551553
artist = self.plotter.axes.text(
552554
x, y, f'{text}',
553-
fontsize=12,
555+
fontsize=self.plotter.fontsize,
554556
family='monospace',
555557
ha='center', va='center',
556558
zorder=10000,

src/compas_plotters/artists/networkartist.py

Lines changed: 113 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@
99
from matplotlib.patches import Circle
1010

1111
from compas.datastructures import Network
12+
from compas.artists import NetworkArtist
13+
from compas.utilities.colors import is_color_light
1214
from .artist import PlotterArtist
1315

1416
Color = Tuple[float, float, float]
1517

1618

17-
class NetworkArtist(PlotterArtist):
19+
class NetworkArtist(PlotterArtist, NetworkArtist):
1820
"""Artist for COMPAS network data structures.
1921
2022
Parameters
@@ -57,18 +59,19 @@ def __init__(self,
5759
network: Network,
5860
nodes: Optional[List[int]] = None,
5961
edges: Optional[List[int]] = None,
60-
nodecolor: Color = (1, 1, 1),
61-
edgecolor: Color = (0, 0, 0),
62+
nodecolor: Color = (1.0, 1.0, 1.0),
63+
edgecolor: Color = (0.0, 0.0, 0.0),
6264
edgewidth: float = 1.0,
6365
show_nodes: bool = True,
6466
show_edges: bool = True,
6567
nodesize: int = 5,
6668
sizepolicy: Literal['relative', 'absolute'] = 'relative',
67-
zorder: int = 2000,
69+
zorder: int = 1000,
6870
**kwargs):
6971

7072
super().__init__(network=network, **kwargs)
7173

74+
self.sizepolicy = sizepolicy
7275
self.nodes = nodes
7376
self.edges = edges
7477
self.node_color = nodecolor
@@ -77,16 +80,15 @@ def __init__(self,
7780
self.edge_width = edgewidth
7881
self.show_nodes = show_nodes
7982
self.show_edges = show_edges
80-
self.sizepolicy = sizepolicy
8183
self.zorder = zorder
8284

8385
@property
8486
def zorder_edges(self):
85-
return self.zorder
87+
return self.zorder + 10
8688

8789
@property
8890
def zorder_nodes(self):
89-
return self.zorder + 10
91+
return self.zorder + 20
9092

9193
@property
9294
def item(self):
@@ -101,6 +103,22 @@ def item(self, item: Network):
101103
def data(self) -> List[List[float]]:
102104
return self.network.nodes_attributes('xy')
103105

106+
@property
107+
def node_size(self):
108+
if not self._node_size:
109+
factor = self.plotter.dpi if self.sizepolicy == 'absolute' else self.network.number_of_nodes()
110+
size = self.default_nodesize / factor
111+
self._node_size = {node: size for node in self.network.nodes()}
112+
return self._node_size
113+
114+
@node_size.setter
115+
def node_size(self, nodesize):
116+
factor = self.plotter.dpi if self.sizepolicy == 'absolute' else self.network.number_of_nodes()
117+
if isinstance(nodesize, dict):
118+
self.node_size.update({node: size / factor for node, size in nodesize.items()})
119+
elif isinstance(nodesize, (int, float)):
120+
self._node_size = {node: nodesize / factor for node in self.network.nodes()}
121+
104122
# ==============================================================================
105123
# clear and draw
106124
# ==============================================================================
@@ -218,3 +236,91 @@ def draw_edges(self,
218236
)
219237
self.plotter.axes.add_collection(collection)
220238
self._edgecollection = collection
239+
240+
def draw_nodelabels(self, text: Optional[Dict[int, str]] = None) -> None:
241+
"""Draw a selection of node labels.
242+
243+
Parameters
244+
----------
245+
text : dict of int to str, optional
246+
A node-label map.
247+
If not text dict is provided, the node identifiers are drawn.
248+
249+
Returns
250+
-------
251+
None
252+
"""
253+
if self._nodelabelcollection:
254+
for artist in self._nodelabelcollection:
255+
artist.remove()
256+
257+
if text:
258+
self.node_text = text
259+
260+
labels = []
261+
for node in self.nodes:
262+
bgcolor = self.node_color.get(node, self.default_nodecolor)
263+
color = (0, 0, 0) if is_color_light(bgcolor) else (1, 1, 1)
264+
265+
text = self.node_text.get(node, None)
266+
print(text)
267+
if text is None:
268+
continue
269+
270+
x, y = self.node_xyz[node][:2]
271+
artist = self.plotter.axes.text(
272+
x, y,
273+
f'{text}',
274+
fontsize=self.plotter.fontsize,
275+
family='monospace',
276+
ha='center', va='center',
277+
zorder=10000,
278+
color=color
279+
)
280+
labels.append(artist)
281+
282+
self._nodelabelcollection = labels
283+
284+
def draw_edgelabels(self, text: Optional[Dict[int, str]] = None) -> None:
285+
"""Draw a selection of edge labels.
286+
287+
Parameters
288+
----------
289+
text : dict of tuple of int to str
290+
An edge-label map.
291+
292+
Returns
293+
-------
294+
None
295+
"""
296+
if self._edgelabelcollection:
297+
for artist in self._edgelabelcollection:
298+
artist.remove()
299+
300+
if text:
301+
self.edge_text = text
302+
303+
labels = []
304+
for edge in self.edges:
305+
u, v = edge
306+
text = self.edge_text.get(edge, self.edge_text.get((v, u), None))
307+
if text is None:
308+
continue
309+
310+
x0, y0 = self.node_xyz[edge[0]][:2]
311+
x1, y1 = self.node_xyz[edge[1]][:2]
312+
x = 0.5 * (x0 + x1)
313+
y = 0.5 * (y0 + y1)
314+
315+
artist = self.plotter.axes.text(
316+
x, y, f'{text}',
317+
fontsize=self.plotter.fontsize,
318+
family='monospace',
319+
ha='center', va='center',
320+
zorder=10000,
321+
color=(0, 0, 0),
322+
bbox=dict(boxstyle='round, pad=0.3', facecolor=(1, 1, 1), edgecolor=None, linewidth=0)
323+
)
324+
labels.append(artist)
325+
326+
self._edgelabelcollection = labels

src/compas_plotters/plotter.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ class Plotter(metaclass=Singleton):
3333
3434
"""
3535

36+
fontsize = 12
37+
3638
def __init__(self,
3739
view: Tuple[Tuple[float, float], Tuple[float, float]] = ((-8.0, 16.0), (-5.0, 10.0)),
3840
figsize: Tuple[float, float] = (8.0, 5.0),

0 commit comments

Comments
 (0)