我正在为演示文稿绘制许多数据框。这些列都有不同的列,但都包含相同的附加列foobar
。目前,我正在使用
df.plot(secondary_y='foobar')
不幸的是,由于这些数据框都有不同的附加列,排序不同,foobar
的颜色总是不同。这使得演示幻灯片不必要复杂化。我希望,在不同的图表中,指定foobar
以粗体和黑色绘制。
查看the docs,关闭的唯一内容似乎是参数colormap
- 我需要确保颜色地图中的x
颜色始终为黑色,其中x
是数据框中foobar
的顺序。似乎比它应该更复杂,这也不会使它变得大胆。
是否有更好的方法?
答案 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')
答案 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()
产量
答案 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)