mpld3.show() returns int 类型的对象不是 JSON 可序列化的
mpld3.show() returns Object of type int is not JSON serializable
我想创建一个网络,您可以将鼠标悬停在每个标签上以交互方式阅读它。
我正在使用 jupyter lab,规格是:
选定的 Jupyter 核心包...
IPython : 7.6.1
ipykernel : 5.1.1
ipywidgets : 7.6.5
jupyter_client : 7.0.6
jupyter_core : 4.8.1
jupyter_server : not installed
jupyterlab : 1.0.2
nbclient : not installed
nbconvert : 5.5.0
nbformat : 4.4.0
notebook : 6.0.0
qtconsole : 4.5.1
traitlets : 4.3.2
当我在 jupyter notebook 中 运行 这段代码时:
import matplotlib.pyplot as plt
import numpy as np
import mpld3
fig, ax = plt.subplots(subplot_kw=dict(axisbg='#EEEEEE'))
N = 100
scatter = ax.scatter(np.random.normal(size=N),
np.random.normal(size=N),
c=np.random.random(size=N),
s=1000 * np.random.random(size=N),
alpha=0.3,
cmap=plt.cm.jet)
ax.grid(color='white', linestyle='solid')
ax.set_title("Scatter Plot (with tooltips!)", size=20)
labels = ['point {0}'.format(i + 1) for i in range(N)]
tooltip = mpld3.plugins.PointLabelTooltip(scatter, labels=labels)
mpld3.plugins.connect(fig, tooltip)
mpld3.show()
我从 here 获得的,一个新的 window 打开,带有交互式标签,正如预期的那样,与超链接中的示例相同。
我自己的数据是:
index col_A
0 6840
1 6640
2 823
3 57019
index col_B
0 7431
1 5217
2 7431
3 57019
对于网络,这些是节点标签对,如下所示:
col_A col_B
6840 7431
6640 5217
823 7431
57019 57019
所以输出网络应该有三个集群:
6840-7431-823
6640-5217
57019-57019
当我运行这段代码时,它与上面的示例代码几乎相同:
import matplotlib.pyplot as plt
import numpy as np
import mpld3
import mplcursors
import networkx as nx
#G = nx.path_graph(4)
#pos = nx.spring_layout(G)
G = nx.from_pandas_edgelist(final_net,'col_A','col_B',['col_A', 'col_B'])
print(final_net['col_A'][0:10])
print(final_net['col_B'][0:10])
edge_labels = nx.get_edge_attributes(G, "Edge_label")
pos = nx.spring_layout(G)
fig, ax = plt.subplots(subplot_kw=dict(facecolor='#EEEEEE'))
scatter = nx.draw_networkx_nodes(G, pos, ax=ax)
nx.draw_networkx_edges(G, pos, ax=ax)
labels = G.nodes()
tooltip = mpld3.plugins.PointLabelTooltip(scatter, labels=labels)
mpld3.plugins.connect(fig, tooltip)
mplcursors.cursor(hover=True)
mpld3.show()
我确实得到了正确的静态图像:
但是我得到一个错误:
TypeError: Object of type int is not JSON serializable
并且网络不会在我可以与之交互的新 window 中打开(理想情况下,交互式网络无论如何都会保留在 jupyter 中)。
我将对象类型更改为字符串以查看发生了什么:
final_net['col_A'] = pd.to_numeric(final_net['col_A'])
final_net['col_B'] = pd.to_numeric(final_net['col_B'])
输出:
col_A int64
col_B int64
但错误依旧。当我删除最后一行 mpld3.show()
时,错误消失了,所以我只得到一个静态图像作为输出,没有错误,但也没有交互性。
我按照 (which keeps the same error) and then I dumped to JSON as per here
卸载并重新安装了 conda
通过做:
import json
import numpy as np
data = [[6840, 7431], [6640, 5217], [823, 7431],[57019,57019]]
final_net = pd.DataFrame(data, columns = ['col_A', 'col_B'])
class NumpyEncoder(json.JSONEncoder):
""" Special json encoder for numpy types """
def default(self, obj):
if isinstance(obj, np.integer):
return int(obj)
elif isinstance(obj, np.floating):
return float(obj)
elif isinstance(obj, np.ndarray):
return obj.tolist()
return json.JSONEncoder.default(self, obj)
#dumped = json.dumps(final_net, cls=NumpyEncoder)
#with open(path, 'w') as f:
# json.dump(dumped, f)
final_net['col_A'] = json.dumps(final_net['col_A'],cls=NumpyEncoder)
final_net['col_B'] = json.dumps(final_net['col_B'],cls=NumpyEncoder)
当我转储到 json 然后重新 运行 我的网络代码时,它输出:
0 "{\"0\":6840,\"1\":6640,\"2\":823,\"3\":57019}"
1 "{\"0\":6840,\"1\":6640,\"2\":823,\"3\":57019}"
2 "{\"0\":6840,\"1\":6640,\"2\":823,\"3\":57019}"
3 "{\"0\":6840,\"1\":6640,\"2\":823,\"3\":57019}"
Name: Entrez Gene Interactor A, dtype: object
0 "{\"0\":7431,\"1\":5217,\"2\":7431,\"3\":57019}"
1 "{\"0\":7431,\"1\":5217,\"2\":7431,\"3\":57019}"
2 "{\"0\":7431,\"1\":5217,\"2\":7431,\"3\":57019}"
3 "{\"0\":7431,\"1\":5217,\"2\":7431,\"3\":57019}"
而这张图片(是错误的),并没有交互性。
我想知道是否有人可以告诉我如何编辑我的代码以使交互功能出现(最好是在 jupyter notebook 中,如果不是,它可以在新的 window 中打开)。
问题似乎是 G.nodes()
不是标签列表。您可以通过将其转换为列表来获取节点号或标签(list(G.nodes())
)。
更新后的版本可能如下所示:
import matplotlib.pyplot as plt
import networkx as nx
import pandas as pd
import numpy as np
import mpld3
final_net = pd.DataFrame({'col_A': [6840, 6640, 823, 57019],
'col_B': [7431, 5217, 7431, 57019]})
G = nx.from_pandas_edgelist(final_net, 'col_A', 'col_B', ['col_A', 'col_B'])
print(final_net['col_A'][0:10])
print(final_net['col_B'][0:10])
edge_labels = nx.get_edge_attributes(G, "Edge_label")
pos = nx.spring_layout(G)
fig, ax = plt.subplots(subplot_kw=dict(facecolor='#EEEEEE'))
scatter = nx.draw_networkx_nodes(G, pos, ax=ax)
nx.draw_networkx_edges(G, pos, ax=ax)
labels = list(G.nodes())
tooltip = mpld3.plugins.PointLabelTooltip(scatter, labels=labels)
mpld3.plugins.connect(fig, tooltip)
mpld3.show()
我想创建一个网络,您可以将鼠标悬停在每个标签上以交互方式阅读它。
我正在使用 jupyter lab,规格是: 选定的 Jupyter 核心包...
IPython : 7.6.1
ipykernel : 5.1.1
ipywidgets : 7.6.5
jupyter_client : 7.0.6
jupyter_core : 4.8.1
jupyter_server : not installed
jupyterlab : 1.0.2
nbclient : not installed
nbconvert : 5.5.0
nbformat : 4.4.0
notebook : 6.0.0
qtconsole : 4.5.1
traitlets : 4.3.2
当我在 jupyter notebook 中 运行 这段代码时:
import matplotlib.pyplot as plt
import numpy as np
import mpld3
fig, ax = plt.subplots(subplot_kw=dict(axisbg='#EEEEEE'))
N = 100
scatter = ax.scatter(np.random.normal(size=N),
np.random.normal(size=N),
c=np.random.random(size=N),
s=1000 * np.random.random(size=N),
alpha=0.3,
cmap=plt.cm.jet)
ax.grid(color='white', linestyle='solid')
ax.set_title("Scatter Plot (with tooltips!)", size=20)
labels = ['point {0}'.format(i + 1) for i in range(N)]
tooltip = mpld3.plugins.PointLabelTooltip(scatter, labels=labels)
mpld3.plugins.connect(fig, tooltip)
mpld3.show()
我从 here 获得的,一个新的 window 打开,带有交互式标签,正如预期的那样,与超链接中的示例相同。
我自己的数据是:
index col_A
0 6840
1 6640
2 823
3 57019
index col_B
0 7431
1 5217
2 7431
3 57019
对于网络,这些是节点标签对,如下所示:
col_A col_B
6840 7431
6640 5217
823 7431
57019 57019
所以输出网络应该有三个集群:
6840-7431-823
6640-5217
57019-57019
当我运行这段代码时,它与上面的示例代码几乎相同:
import matplotlib.pyplot as plt
import numpy as np
import mpld3
import mplcursors
import networkx as nx
#G = nx.path_graph(4)
#pos = nx.spring_layout(G)
G = nx.from_pandas_edgelist(final_net,'col_A','col_B',['col_A', 'col_B'])
print(final_net['col_A'][0:10])
print(final_net['col_B'][0:10])
edge_labels = nx.get_edge_attributes(G, "Edge_label")
pos = nx.spring_layout(G)
fig, ax = plt.subplots(subplot_kw=dict(facecolor='#EEEEEE'))
scatter = nx.draw_networkx_nodes(G, pos, ax=ax)
nx.draw_networkx_edges(G, pos, ax=ax)
labels = G.nodes()
tooltip = mpld3.plugins.PointLabelTooltip(scatter, labels=labels)
mpld3.plugins.connect(fig, tooltip)
mplcursors.cursor(hover=True)
mpld3.show()
我确实得到了正确的静态图像:
但是我得到一个错误:
TypeError: Object of type int is not JSON serializable
并且网络不会在我可以与之交互的新 window 中打开(理想情况下,交互式网络无论如何都会保留在 jupyter 中)。
我将对象类型更改为字符串以查看发生了什么:
final_net['col_A'] = pd.to_numeric(final_net['col_A'])
final_net['col_B'] = pd.to_numeric(final_net['col_B'])
输出:
col_A int64
col_B int64
但错误依旧。当我删除最后一行 mpld3.show()
时,错误消失了,所以我只得到一个静态图像作为输出,没有错误,但也没有交互性。
我按照
通过做:
import json
import numpy as np
data = [[6840, 7431], [6640, 5217], [823, 7431],[57019,57019]]
final_net = pd.DataFrame(data, columns = ['col_A', 'col_B'])
class NumpyEncoder(json.JSONEncoder):
""" Special json encoder for numpy types """
def default(self, obj):
if isinstance(obj, np.integer):
return int(obj)
elif isinstance(obj, np.floating):
return float(obj)
elif isinstance(obj, np.ndarray):
return obj.tolist()
return json.JSONEncoder.default(self, obj)
#dumped = json.dumps(final_net, cls=NumpyEncoder)
#with open(path, 'w') as f:
# json.dump(dumped, f)
final_net['col_A'] = json.dumps(final_net['col_A'],cls=NumpyEncoder)
final_net['col_B'] = json.dumps(final_net['col_B'],cls=NumpyEncoder)
当我转储到 json 然后重新 运行 我的网络代码时,它输出:
0 "{\"0\":6840,\"1\":6640,\"2\":823,\"3\":57019}"
1 "{\"0\":6840,\"1\":6640,\"2\":823,\"3\":57019}"
2 "{\"0\":6840,\"1\":6640,\"2\":823,\"3\":57019}"
3 "{\"0\":6840,\"1\":6640,\"2\":823,\"3\":57019}"
Name: Entrez Gene Interactor A, dtype: object
0 "{\"0\":7431,\"1\":5217,\"2\":7431,\"3\":57019}"
1 "{\"0\":7431,\"1\":5217,\"2\":7431,\"3\":57019}"
2 "{\"0\":7431,\"1\":5217,\"2\":7431,\"3\":57019}"
3 "{\"0\":7431,\"1\":5217,\"2\":7431,\"3\":57019}"
而这张图片(是错误的),并没有交互性。
我想知道是否有人可以告诉我如何编辑我的代码以使交互功能出现(最好是在 jupyter notebook 中,如果不是,它可以在新的 window 中打开)。
问题似乎是 G.nodes()
不是标签列表。您可以通过将其转换为列表来获取节点号或标签(list(G.nodes())
)。
更新后的版本可能如下所示:
import matplotlib.pyplot as plt
import networkx as nx
import pandas as pd
import numpy as np
import mpld3
final_net = pd.DataFrame({'col_A': [6840, 6640, 823, 57019],
'col_B': [7431, 5217, 7431, 57019]})
G = nx.from_pandas_edgelist(final_net, 'col_A', 'col_B', ['col_A', 'col_B'])
print(final_net['col_A'][0:10])
print(final_net['col_B'][0:10])
edge_labels = nx.get_edge_attributes(G, "Edge_label")
pos = nx.spring_layout(G)
fig, ax = plt.subplots(subplot_kw=dict(facecolor='#EEEEEE'))
scatter = nx.draw_networkx_nodes(G, pos, ax=ax)
nx.draw_networkx_edges(G, pos, ax=ax)
labels = list(G.nodes())
tooltip = mpld3.plugins.PointLabelTooltip(scatter, labels=labels)
mpld3.plugins.connect(fig, tooltip)
mpld3.show()