在Python中按类别分组进行绘图

时间:2018-07-26 20:15:19

标签: python python-3.x plotly

我有一个只有5个变量的pandas数据框。我想通过分类变量创建散点图和颜色。我正在使用Plotly,所以我可以在特定区域进行活动。不允许我将分类变量列表作为颜色传递。先感谢您!这是我的代码:

import plotly.graph_objs as go
import plotly.plotly as py
import plotly.tools

plotly.tools.set_credentials_file(username='user', api_key='key')

trace1 = go.Scatter(
    x = df['var1'],
    y = df['var2'],
    mode='markers',
    marker=dict(
        size=16,
        color = df['categorialVar'], #set color equal to a variable
        showscale=True
    )
)
data = [trace1]

py.iplot(data, filename='scatter-plot-with-colorscale')

2 个答案:

答案 0 :(得分:0)

最近遇到了这个问题并提出了解决方案:

def get_random_qualitative_color_map(
        categorial_series: pd.Series,
        colors: typing.List[str] = plotly_colors.qualitative.Alphabet
) -> typing.List[str]:
    """
    Returns a color coding for a given series (one color for every unique value). Will repeat colors if not enough are
    provided.
    :param categorial_series: A series of categorial data
    :param colors: color codes (everything plotly accepts)
    :return: Array of colors matching the index of the objects
    """
    # get unique identifiers
    unique_series = categorial_series.unique()

    # create lookup table - colors will be repeated if not enough
    color_lookup_table = dict((value, color) for (value, color) in zip(unique_series, itertools.cycle(colors)))

    # look up the colors in the table
    return [color_lookup_table[key] for key in categorial_series]
  • 如果颜色数组为空,则解决方案会重复颜色
  • 可以与任何调色板一起使用(在本例中为plot.ly字母是默认设置)

说明

unique_series = categorial_series.unique()

首先,我们获得系列中的唯一值。每个人都将与一种颜色匹配。

color_lookup_table = dict((value, color) for (value, color) in zip(unique_series, itertools.cycle(colors)))

接下来,我们将创建一个dict(用作查找表的功能-我们可以查找属于哪个类别元素的颜色。这里最棘手的部分是使用itertools.cycle(colors)。此函数将返回一个迭代器,该迭代器将始终循环给定可迭代项中的所有值(在这种情况下,这是由plot.ly定义的颜色列表)。

接下来,我们将zip这个迭代器和实际的唯一项。这将创建(unique_item,颜色)对。我们获得了永不耗尽颜色的良好效果(因为循环迭代器将无限运行)。表示返回的字典将包含len(unique_series)个项目。

[color_lookup_table[key] for key in categorial_series]

最后,我们使用列表推导在查找表中查找系列中的每个条目。这将为数据点创建颜色列表。然后,该列表可以用作任何color的标记字典中plotly.graphics_object参数的参数。

答案 1 :(得分:-1)

因此,我没有继续用图来寻找解决方案,而是留在了seaborn可视化库中,并添加了“%matplotlib笔记本”,该方法效果很好并且很容易。

%matplotlib notebook

# Plot t-SNE
sns.set_context("notebook", font_scale=1.1)
sns.set_style("ticks")

sns.lmplot(x='var1',
       y='var2',
       data=tsne_out,
       fit_reg=False,
       legend=True,
       size=9,
       hue='categorialVar',
       scatter_kws={"s":200, "alpha":0.3})

plt.title('Plot Title', weight='bold').set_fontsize('14')
plt.xlabel('Dimension 1', weight='bold').set_fontsize('10')
plt.ylabel('Dimension 2', weight='bold').set_fontsize('10')