Python ggplot 绘制超过8只股票时图例被截断问题

3 投票
1 回答
2036 浏览
提问于 2025-04-17 23:12

首先,我想说Python的ggplot是一个伟大事物的开端,开发者们为此付出了很多努力,值得赞扬。目前,我在同一个图表上遇到了两个主要问题。如果我绘制8只股票或更少,图像看起来不错,只是图例部分超出了图表的区域(问题1)。如果我绘制超过8只股票,图表就会出现一些奇怪的线条,这些线条明显不代表数据。此外,图例不会自动调整大小,而是会漏掉额外的股票代码(问题2)。任何帮助都非常感谢。谢谢!

正常的绘图代码:

import datetime
from ggplot import *
import pandas.io.data as web
import pandas as pd
import numpy as np

start = datetime.datetime(2014,1,1)
end = datetime.datetime(2014, 3,19)

stocks = ['APO','AVG','FI','ANIK','CELG','PACW','CBOE','BIIB']

stockData = {}
for ticker in stocks:
    stockData[ticker] = web.get_data_yahoo(ticker, start, end)

price = pd.DataFrame({tic: data['Adj Close'] for tic, data in stockData.iteritems()})

returns = price.pct_change()
returns = returns.apply(cumsum)

rt = returns.index
returns['Date'] = rt


# plotting the cum performance for each security

ret = pd.melt(returns, id_vars='Date') 
plot = ggplot(aes(x='Date', y='value', color='variable'),data=ret) +geom_line()

# plotting the equity curve of the theoretical portfolio

zt = returns
del zt['Date']
zt = zt.apply(np.sum, axis=1)
z = pd.DataFrame(zt, index=zt.index)
z['Date'] = rt
z.columns = ['equity curve', 'Date']


ret2 = pd.melt(z, id_vars='Date') 
plot2 = ggplot(aes(x='Date', y='value'),data=ret2) +geom_line()

print plot
print plot2

有问题的绘图代码:

import datetime
from ggplot import *
import pandas.io.data as web
import pandas as pd
import numpy as np

start = datetime.datetime(2014,1,1)
end = datetime.datetime(2014, 3,19)

stocks = ['APO','AVG','FI','ANIK','CELG','PACW','CBOE','BIIB','ISIS', 'SDRL'] # <-- notice two additional tickers

stockData = {}
for ticker in stocks:
    stockData[ticker] = web.get_data_yahoo(ticker, start, end)

price = pd.DataFrame({tic: data['Adj Close'] for tic, data in stockData.iteritems()})

returns = price.pct_change()
returns = returns.apply(cumsum)

rt = returns.index
returns['Date'] = rt


# plotting the cum performance for each security

ret = pd.melt(returns, id_vars='Date') 
plot = ggplot(aes(x='Date', y='value', color='variable'),data=ret) +geom_line()

# plotting the equity curve of the theoretical portfolio

zt = returns
del zt['Date']
zt = zt.apply(np.sum, axis=1)
z = pd.DataFrame(zt, index=zt.index)
z['Date'] = rt
z.columns = ['equity curve', 'Date']


ret2 = pd.melt(z, id_vars='Date') 
plot2 = ggplot(aes(x='Date', y='value'),data=ret2) +geom_line()

print plot
print plot2

1 个回答

2

对于问题2,这是因为 ggplot 的颜色用完了,你可以添加更多的颜色来解决这个问题,只需在你的代码开头加上以下代码:

import ggplot as gg
gg.colors.COLORS.extend(["#ff0000", "#00ff00", "#0000ff"]) 

对于问题1,似乎我们需要在创建图形之后再放置图例:

ret = pd.melt(returns, id_vars='Date').dropna()
plot = ggplot(aes(x='Date', y='value', color='variable'), data=ret) +geom_line()
fig = plot.draw()
ax = fig.axes[0]
offbox = ax.artists[0]
offbox.set_bbox_to_anchor((1, 0.5), ax.transAxes)

这是结果:

在这里输入图片描述

撰写回答