def scatters_by_label()

in identity-resolution/notebooks/identity-graph/nepytune/drawing.py [0:0]


def scatters_by_label(graph, attrs_to_skip, sizes=None, colors=None):
    if not colors:
        colors = {}
    if not sizes:
        sizes = {}

    for i, (label, node_group) in enumerate(group_by_label(graph)):
        node_group = list(node_group)
        node_x = []
        node_y = []
        opacity = []
        size_list = []

        for node_id, _ in node_group:
            x, y = graph.node[node_id]["pos"]
            opacity.append(graph.node[node_id].get("opacity", 1))
            size_list.append(
                graph.node[node_id].get("size", sizes.get(label, 10))
            )
            node_x.append(x)
            node_y.append(y)

        node_trace = go.Scatter(
            x=node_x, y=node_y,
            name=label,
            mode='markers',
            hoverinfo='text',
            marker=dict(
                showscale=False,
                colorscale='Hot',
                reversescale=True,
                color=colors.get(label, i * 5),
                opacity=opacity,
                size=size_list,
                line_width=2
            )
        )

        node_text = []

        def format_v(attr, value):
            if isinstance(value, dict):
                return "".join([format_v(k, str(v)) for k, v in value.items()])
            value = str(value)
            if len(value) < 80:
                return f"</br>{attr}: {value}"
            else:
                result = f"</br>{attr}: "
                substr = ""
                for word in value.split(" "):
                    if len(word + substr) < 80:
                        substr = f"{substr} {word}"
                    else:
                        result = f"{result} </br> {5 * ' '} {substr}"
                        substr = ""

                return f"{result} </br> {5 * ' '} {substr}"

        for node_id, attr_dict in node_group:
            node_text.append(
                "".join([
                    format_v(attr, value) for attr, value in attr_dict.items()
                    if attr not in attrs_to_skip
                ])
            )

        node_trace.text = node_text

        yield node_trace