我可以协调 seaborn 和 networkx 之间的颜色吗?
Can I coordinate colors between seaborn and networkx?
我正在尝试协调 networkx
网络图表上的颜色与 seaborn
图表上的颜色。当我使用相同的颜色托盘 (Dark2) 和相同的组 ID 时,这两个图仍然不同。需要明确的是,第 0 组中的节点应该与第 0 组中的条相同。这同样适用于第 1 组和第 2 组。这是我在 运行 下面的代码时得到的图表,显示颜色不一致:
当我 运行 下面的代码时,在网络图中,第 0 组的颜色与它们在计数图中的颜色相同。但是第 1 组和第 2 组在网络图和计数图之间改变颜色。 有谁知道如何协调颜色?
我比较了 plt.cm.Dark2.colors
和 sns.color_palette('Dark2', 3)
中的颜色映射,它们看起来是一样的(除了 sns
只包含前 3 种颜色这一事实。
另外值得注意的是,seaborn
是在expected order of colors之后,networkx
不是。
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
import seaborn as sns
# create dataframe of connections
df = pd.DataFrame({ 'from':['A', 'B', 'C','A'], 'to':['D', 'A', 'E','C']})
# create graph
G = nx.Graph()
for i, r in df.iterrows():
G.add_edge(r['from'], r['to'])
# create data frame mapping nodes to groups
groups_df = pd.DataFrame()
for i in G.nodes():
if i in 'AD':
group = 0
elif i in 'BC':
group = 1
else:
group = 2
groups_df.loc[i, 'group'] = group
# make sure it's in same order as nodes of graph
groups_df = groups_df.reindex(G.nodes())
# create node node and count chart where color is group id
fig, ax = plt.subplots(ncols=2)
nx.draw(G, with_labels=True, node_color=groups_df['group'], cmap=plt.cm.Dark2, ax=ax[0])
sns.countplot('index', data=groups_df.reset_index(), palette='Dark2', hue='group', ax=ax[1])
networkx 在颜色图的颜色上平均分配值。由于它显然不能接受 norm
(这是解决此问题的常用方法),因此您需要创建一个仅包含您感兴趣的颜色的新颜色图。
cmap = ListedColormap(plt.cm.Dark2(np.arange(3)))
此外,seaborn 会降低要使用的颜色的饱和度,因此要获得与颜色图相同的颜色,您需要在 seaborn 调用中设置 saturation=1
。
import numpy as np
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
import seaborn as sns
# create dataframe of connections
df = pd.DataFrame({ 'from':['A', 'B', 'C','A'], 'to':['D', 'A', 'E','C']})
# create graph
G = nx.Graph()
for i, r in df.iterrows():
G.add_edge(r['from'], r['to'])
# create data frame mapping nodes to groups
groups_df = pd.DataFrame()
for i in G.nodes():
if i in 'AD':
group = 0
elif i in 'BC':
group = 1
else:
group = 2
groups_df.loc[i, 'group'] = group
# make sure it's in same order as nodes of graph
groups_df = groups_df.reindex(G.nodes())
# create node node and count chart where color is group id
fig, ax = plt.subplots(ncols=2)
# create new colormap with only the first 3 colors from Dark2
cmap = ListedColormap(plt.cm.Dark2(np.arange(3)))
nx.draw(G, with_labels=True, node_color=groups_df['group'], cmap=cmap, ax=ax[0])
sns.countplot('index', data=groups_df.reset_index(), palette=cmap.colors, hue='group', ax=ax[1], saturation=1)
plt.show()
我正在尝试协调 networkx
网络图表上的颜色与 seaborn
图表上的颜色。当我使用相同的颜色托盘 (Dark2) 和相同的组 ID 时,这两个图仍然不同。需要明确的是,第 0 组中的节点应该与第 0 组中的条相同。这同样适用于第 1 组和第 2 组。这是我在 运行 下面的代码时得到的图表,显示颜色不一致:
当我 运行 下面的代码时,在网络图中,第 0 组的颜色与它们在计数图中的颜色相同。但是第 1 组和第 2 组在网络图和计数图之间改变颜色。 有谁知道如何协调颜色?
我比较了 plt.cm.Dark2.colors
和 sns.color_palette('Dark2', 3)
中的颜色映射,它们看起来是一样的(除了 sns
只包含前 3 种颜色这一事实。
另外值得注意的是,seaborn
是在expected order of colors之后,networkx
不是。
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
import seaborn as sns
# create dataframe of connections
df = pd.DataFrame({ 'from':['A', 'B', 'C','A'], 'to':['D', 'A', 'E','C']})
# create graph
G = nx.Graph()
for i, r in df.iterrows():
G.add_edge(r['from'], r['to'])
# create data frame mapping nodes to groups
groups_df = pd.DataFrame()
for i in G.nodes():
if i in 'AD':
group = 0
elif i in 'BC':
group = 1
else:
group = 2
groups_df.loc[i, 'group'] = group
# make sure it's in same order as nodes of graph
groups_df = groups_df.reindex(G.nodes())
# create node node and count chart where color is group id
fig, ax = plt.subplots(ncols=2)
nx.draw(G, with_labels=True, node_color=groups_df['group'], cmap=plt.cm.Dark2, ax=ax[0])
sns.countplot('index', data=groups_df.reset_index(), palette='Dark2', hue='group', ax=ax[1])
networkx 在颜色图的颜色上平均分配值。由于它显然不能接受 norm
(这是解决此问题的常用方法),因此您需要创建一个仅包含您感兴趣的颜色的新颜色图。
cmap = ListedColormap(plt.cm.Dark2(np.arange(3)))
此外,seaborn 会降低要使用的颜色的饱和度,因此要获得与颜色图相同的颜色,您需要在 seaborn 调用中设置 saturation=1
。
import numpy as np
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
import seaborn as sns
# create dataframe of connections
df = pd.DataFrame({ 'from':['A', 'B', 'C','A'], 'to':['D', 'A', 'E','C']})
# create graph
G = nx.Graph()
for i, r in df.iterrows():
G.add_edge(r['from'], r['to'])
# create data frame mapping nodes to groups
groups_df = pd.DataFrame()
for i in G.nodes():
if i in 'AD':
group = 0
elif i in 'BC':
group = 1
else:
group = 2
groups_df.loc[i, 'group'] = group
# make sure it's in same order as nodes of graph
groups_df = groups_df.reindex(G.nodes())
# create node node and count chart where color is group id
fig, ax = plt.subplots(ncols=2)
# create new colormap with only the first 3 colors from Dark2
cmap = ListedColormap(plt.cm.Dark2(np.arange(3)))
nx.draw(G, with_labels=True, node_color=groups_df['group'], cmap=cmap, ax=ax[0])
sns.countplot('index', data=groups_df.reset_index(), palette=cmap.colors, hue='group', ax=ax[1], saturation=1)
plt.show()