bnlearn icon indicating copy to clipboard operation
bnlearn copied to clipboard

ValueError in Interactive Plot: [tooltip text] must be of same length as the number of nodes

Open KevinHooah opened this issue 2 years ago • 10 comments

Hello,

When I am going to plot the interactive figure (the static figure works fine), I get the following errors:

ValueError                                Traceback (most recent call last)
[<ipython-input-20-bda0a8197673>](https://localhost:8080/#) in <cell line: 1>()
----> 1 bn.plot(model2_update, title = 'DAG for SJV', interactive=True)

2 frames
[/usr/local/lib/python3.10/dist-packages/bnlearn/bnlearn.py](https://localhost:8080/#) in plot(model, pos, scale, interactive, title, node_color, node_size, node_properties, edge_properties, params_interactive, params_static, verbose)
   1096         print("number of node: ", len(nodelist), "number of tip", len(tooltip))
   1097         # Make interactive plot
-> 1098         fig = _plot_interactive(params_interactive,
   1099                                 nodelist,
   1100                                 node_colors,

[/usr/local/lib/python3.10/dist-packages/bnlearn/bnlearn.py](https://localhost:8080/#) in _plot_interactive(params_interactive, nodelist, node_colors, node_sizes, edgelist, edge_colors, edge_weights, title, tooltip, verbose)
   1204     _, IB = ismember([*d3.D3graph.node_properties.keys()], nodelist)
   1205 
-> 1206     d3.D3graph.set_node_properties(tooltip=np.array(tooltip)[IB],
   1207                                    size=np.array(node_sizes)[IB],
   1208                                    color=np.array(node_colors)[IB],

[/usr/local/lib/python3.10/dist-packages/d3graph/d3graph.py](https://localhost:8080/#) in set_node_properties(self, label, marker, tooltip, color, opacity, size, edge_color, edge_size, fontcolor, fontsize, cmap, scaler, minmax)
    449         else:
    450             tooltip = np.array([''] * nodecount)
--> 451         if len(tooltip) != nodecount: raise ValueError("[tooltip text] must be of same length as the number of nodes")

    452 
    453         # ############ Set node color #############

ValueError: [tooltip text] must be of same length as the number of nodes

I check the number of node and the number of tip in the bnlearn.py's plot function, before it calls fig = _plot_interactive, the number of nodes equals the number of tip.

I also get these output before the error pops out, incase it is helpful:

[d3blocks] >INFO> Cleaning edge_properties and config parameters..
[d3blocks] >INFO> Converting source-target into adjacency matrix..
[d3blocks] >INFO> Making the matrix symmetric..
[d3blocks] >INFO> Set directed=True to see the markers!
[d3blocks] >INFO> Keep only edges with weight>0
[d3blocks] >INFO> Converting source-target into adjacency matrix..
[d3blocks] >INFO> Making the matrix symmetric..
[d3blocks] >INFO> Converting adjacency matrix into source-target..
[d3blocks] >INFO> Number of unique nodes: 6
[d3blocks] >INFO> Slider range is set to [0, 10]
[d3blocks] >INFO> Write to path: [/tmp/tmpyfm91v_7/d3graph.html]
[d3blocks] >INFO> File already exists and will be overwritten: [/tmp/tmpyfm91v_7/d3graph.html]
[bnlearn] >Set node properties.
[bnlearn]> Set edge weights based on the [chi_square] test statistic.
[bnlearn] >Converting source-target into adjacency matrix..
[bnlearn] >Making the matrix symmetric..
[bnlearn] >Set edge properties.
[d3blocks] >INFO> Keep only edges with weight>0
[d3blocks] >INFO> Converting source-target into adjacency matrix..
[d3blocks] >INFO> Making the matrix symmetric..

Thank you for your help in advance.

KevinHooah avatar Mar 14 '24 17:03 KevinHooah

Thank you for mentioning this. I fixed this issue before. Can you force update to the latest version of bnlearn and d3blocks?

pip install -U bnlearn pip install -U d3blocks

I created a new release of bnlearn where I included d3blocks with a minimum version of 1.4.9

erdogant avatar Mar 16 '24 14:03 erdogant

I'm seeing the same issue (same output as original post) even though it appears I have the latest versions of bnlearn (0.8.5) and d3blocks (1.4.9). Do you have any idea why the issue may persist?

mich415 avatar Mar 25 '24 19:03 mich415

mmm. I need more information. Which python version are u using and does it brake also in toy examples?

erdogant avatar Mar 25 '24 20:03 erdogant

python version is 3.12.2, and the examples for the interactive plots in the docs do work.

mich415 avatar Mar 25 '24 21:03 mich415

Can you shown an example with data where it does not work

erdogant avatar Mar 26 '24 06:03 erdogant

Do you maybe have not-unique node names?

erdogant avatar Apr 12 '24 18:04 erdogant

Hello,

Having the exact same problem. Nodes have unique names in my case.

Here is a snapshot of my data: Engine Status Speed Status_Alpha Alpha_Temp Status_Beta
0 0 0.25 0 170 0
1 0 0.21 0 170 0
2 0 0.25 0 170 0
3 0 0.21 0 170 0
4 0 0.21 0 170 0

Beta _Temp   Status_Delta  Delta_Temp Status_Echo  Echo_Temp  

0 190 0 170 0 40
1 190 0 170 0 40
2 190 0 170 0 40
3 190 0 170 0 40
4 190 0 170 0 40

Mix_Gas Mix_98 Mix_95 Cost Energy
0 0 1 0 0.64 8.64
1 0 1 0 0.82 6.07
2 0 1 0 0.90 5.96
3 0 1 0 1.14 4.89
4 0 1 0 0.95 5.11

As you can see, it is a mix of discrete and continuous data (that I discretized)

Loominarty avatar Jul 15 '24 00:07 Loominarty

I have the feeling it has to do with the names. Maybe underscores or other special characters are replaced somewhere to prevent errors in the final results which leads to this error but I do need more information.

erdogant avatar Jul 22 '24 15:07 erdogant

I resolved the issue after several iterations. The error in the interactive plot was due to a mismatch in how node names were cleaned: they were sanitized in d3blocks but not in bnlearn's interactive plot, leading to inconsistencies. Update to the latest version and try again!

pip install -U bnlearn

erdogant avatar Jul 22 '24 16:07 erdogant

The error does not show anymore ! Seems to be all good.

Loominarty avatar Jul 23 '24 01:07 Loominarty