PANDAS绘制多个Y轴

Jor*_*ley 57 python pandas

我知道熊猫支持辅助Y轴,但我很好奇,如果有人知道一种方法将三维Y轴放在图上......目前我用numpy + pyplot实现了这个...但是对于大数据集它很慢.

这是在同一图表上绘制不同单位的不同测量值,以便于比较(例如相对湿度/温度/和电导率)

所以真的很好奇,如果有人知道如果pandas没有太多的工作,这是否可行.

[编辑]我怀疑有没有办法做到这一点(没有太多开销)但是我希望被证明是错误的,这可能是matplotlib的限制......

Cha*_*She 76

我认为这可能有效:

import matplotlib.pyplot as plt
import numpy as np
from pandas import DataFrame
df = DataFrame(np.random.randn(5, 3), columns=['A', 'B', 'C'])

fig, ax = plt.subplots()
ax3 = ax.twinx()
rspine = ax3.spines['right']
rspine.set_position(('axes', 1.15))
ax3.set_frame_on(True)
ax3.patch.set_visible(False)
fig.subplots_adjust(right=0.7)

df.A.plot(ax=ax, style='b-')
# same ax as above since it's automatically added on the right
df.B.plot(ax=ax, style='r-', secondary_y=True)
df.C.plot(ax=ax3, style='g-')

# add legend --> take advantage of pandas providing us access
# to the line associated with the right part of the axis
ax3.legend([ax.get_lines()[0], ax.right_ax.get_lines()[0], ax3.get_lines()[0]],\
           ['A','B','C'], bbox_to_anchor=(1.5, 0.5))
Run Code Online (Sandbox Code Playgroud)

输出:

产量

  • `ax3.set_frame_on(True)` 有什么作用?你能在代码中添加几行注释吗?谢谢! (2认同)
  • 像@tommy.carstensen 一样,我会很感激(更多)评论(最好每行一个)。 (2认同)

Alp*_*pha 21

一个更简单的解决方案plt:

ax1 = df1.plot()

ax2 = ax1.twinx()
ax2.spines['right'].set_position(('axes', 1.0))
df2.plot(ax=ax2)

ax3 = ax1.twinx()
ax3.spines['right'].set_position(('axes', 1.1))
df3.plot(ax=ax3)

....
Run Code Online (Sandbox Code Playgroud)

使用函数实现此目的:

def plot_multi(data, cols=None, spacing=.1, **kwargs):

    from pandas import plotting

    # Get default color style from pandas - can be changed to any other color list
    if cols is None: cols = data.columns
    if len(cols) == 0: return
    colors = getattr(getattr(plotting, '_matplotlib').style, '_get_standard_colors')(num_colors=len(cols))

    # First axis
    ax = data.loc[:, cols[0]].plot(label=cols[0], color=colors[0], **kwargs)
    ax.set_ylabel(ylabel=cols[0])
    lines, labels = ax.get_legend_handles_labels()

    for n in range(1, len(cols)):
        # Multiple y-axes
        ax_new = ax.twinx()
        ax_new.spines['right'].set_position(('axes', 1 + spacing * (n - 1)))
        data.loc[:, cols[n]].plot(ax=ax_new, label=cols[n], color=colors[n % len(colors)], **kwargs)
        ax_new.set_ylabel(ylabel=cols[n])

        # Proper legend position
        line, label = ax_new.get_legend_handles_labels()
        lines += line
        labels += label

    ax.legend(lines, labels, loc=0)
    return ax
Run Code Online (Sandbox Code Playgroud)

例:

from random import randrange

data = pd.DataFrame(dict(
    s1=[randrange(-1000, 1000) for _ in range(100)],
    s2=[randrange(-100, 100) for _ in range(100)],
    s3=[randrange(-10, 10) for _ in range(100)],
))

plot_multi(data.cumsum(), figsize=(10, 5))
Run Code Online (Sandbox Code Playgroud)

输出:

多个Y轴

  • 我收到`AttributeError:模块'pandas.plotting'没有最新的熊猫属性'_matplotlib' (3认同)