【问题标题】:Can I coordinate colors between seaborn and networkx?我可以在 seaborn 和 networkx 之间协调颜色吗?
【发布时间】:2020-04-12 09:40:22
【问题描述】:

我正在尝试将networkx 网络图表上的颜色与seaborn 图表上的颜色进行协调。当我使用相同的颜色托盘 (Dark2) 和相同的组 id 时,这两个图仍然不同。需要明确的是,第 0 组中的节点应与第 0 组中的条形相同。第 1 组和第 2 组也应如此。这是我在运行下面的代码时得到的图表,显示颜色不t 保持一致:

当我在网络图中运行下面的代码时,组 0 的颜色与计数图中的颜色相同。但是第 1 组和第 2 组在网络图和计数图之间改变颜色。 有人知道如何协调颜色吗?

我将plt.cm.Dark2.colors 中的颜色映射与sns.color_palette('Dark2', 3) 中的映射进行了比较,它们看起来是相同的(除了sns 仅包括前三种颜色。

另外值得注意的是,seaborn 是在关注expected order of colorsnetworkx 不是。

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])

【问题讨论】:

    标签: python matplotlib seaborn networkx colormap


    【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 2021-08-20
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 2021-07-06
      • 2011-01-23
      • 2012-01-14
      • 2018-10-22
      • 1970-01-01
      相关资源
      最近更新 更多