熊猫情节:指定颜色

时间:2015-03-22 14:27:09

标签: python pandas matplotlib

我正在为演示文稿绘制许多数据框。这些列都有不同的列,但都包含相同的附加列foobar。目前,我正在使用

绘制这些不同的数据框
df.plot(secondary_y='foobar')

不幸的是,由于这些数据框都有不同的附加列,排序不同,foobar的颜色总是不同。这使得演示幻灯片不必要复杂化。我希望,在不同的图表中,指定foobar以粗体和黑色绘制。

查看the docs,关闭的唯一内容似乎是参数colormap - 我需要确保颜色地图中的x颜色始终为黑色,其中x是数据框中foobar的顺序。似乎比它应该更复杂,这也不会使它变得大胆。

是否有更好的方法?

3 个答案:

答案 0 :(得分:1)

我建议直接使用matplotlib而不是数据框绘图方法。如果df.plot返回了添加的艺术家而不是Axes对象,则在绘制后更改线条的颜色并不会太糟糕。

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

def pandas_plot(ax, df, callout_key):
    """
    Parameters
    ----------
    ax : mpl.Axes
        The axes to draw to

    df : DataFrame
        Data to plot

    callout_key : str
        key to highlight

    """
    artists = {}

    x = df.index.values
    for k, v in df.iteritems():
        style_kwargs = {}
        if k == callout_key:
            style_kwargs['c'] = 'k'
            style_kwargs['lw'] = 2
        ln, = ax.plot(x, v.values, **style_kwargs)
        artists[k] = ln

    ax.legend()
    ax.set_xlim(np.min(x), np.max(x))

    return artists

用法:

fig, ax = plt.subplots()
ax2 = ax.twinx()

th = np.linspace(0, 2*np.pi, 1024)
df = pd.DataFrame({'cos': np.cos(th), 'sin': np.sin(th),
                  'foo': np.sin(th + 1), 'bar': np.cos(th +1)}, index=th)
df2 = pd.DataFrame({'cos': -np.cos(th), 'sin': -np.sin(th)}, index=th)

pandas_plot(ax, df, 'sin')
pandas_plot(ax2, df2, 'sin')

enter image description here

答案 1 :(得分:1)

也许您可以在单独的plot调用中定义一个处理特殊列的函数:

def emphasize_plot(ax, df, col, **emphargs):
    columns = [c for c in df.columns if c != col]
    df[columns].plot(ax=ax)
    df[col].plot(ax=ax, **emphargs)

使用tcaswell示例中的代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

def emphasize_plot(ax, df, col, **emphargs):
    columns = [c for c in df.columns if c != col]
    df[columns].plot(ax=ax)
    df[col].plot(ax=ax, **emphargs)

fig, ax = plt.subplots()
th = np.linspace(0, 2*np.pi, 1024)
df = pd.DataFrame({'cos': np.cos(th), 'foobar': np.sin(th),
                  'foo': np.sin(th + 1), 'bar': np.cos(th +1)}, index=th)
df2 = pd.DataFrame({'cos': -np.cos(th), 'foobar': -np.sin(th)}, index=th)

emphasize_plot(ax, df, 'foobar', lw=2, c='k')
emphasize_plot(ax, df2, 'foobar', lw=2, c='k')
plt.show()

产量

enter image description here

答案 2 :(得分:0)

我使用@ unutbut的答案并将其扩展为允许辅助y轴和正确的图例:

def emphasize_plot(ax, df, col, **emphargs):
    columns = [c for c in df.columns if c != col]
    ax2 = ax.twinx()
    df[columns].plot(ax=ax)
    df[col].plot(ax=ax2, **emphargs)
    lines, labels = ax.get_legend_handles_labels()
    lines2, labels2 = ax2.get_legend_handles_labels()
    ax2.legend(lines + lines2, labels + labels2, loc=0)