Python: 如何使用plotly制作阴影区域或交替背景颜色?
Python: How to make shaded areas or alternating background color using plotly?
仅使用 plot.ly 中的这几行代码,您将在 jupyter notebook 中得到下面的图:
片段 1:
import plotly
import cufflinks as cf
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
init_notebook_mode(connected=True)
iplot(cf.datagen.lines().iplot(asFigure=True,
kind='scatter',xTitle='Dates',yTitle='Returns',title='Returns'))
情节 1:
如何设置才能使下图中的背景颜色交替变化,就像 using matplotlib 中显示的那样?
Here's a link 解释了如何像这样添加阴影区域:
片段 2:
df.iplot(vspan={'x0':'2015-02-15','x1':'2015-03-15','color':'rgba(30,30,30,0.3)','fill':True,'opacity':.4},
filename='cufflinks/custom-regions')
情节 2:
感谢您的任何建议!
正如问题中所建议的,一个可能的解决方案可能在于 vspan
函数。但是,与使用 vspan
和 x 轴的情况相比,使用 hspan
为 y 轴添加多个阴影区域似乎要容易得多。后者需要更多调整。在我建议的解决方案之后可以找到更多详细信息。
下面的图是由下面的片段和函数 multiShades
生成的:
剧情:
片段:
### Setup from the question ###
import plotly
import cufflinks as cf
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
import pandas as pd
import numpy as np
from IPython.display import HTML
from IPython.core.display import display, HTML
import copy
# setup
init_notebook_mode(connected=True)
np.random.seed(123)
cf.set_config_file(theme='pearl')
# Random data using cufflinks
df = cf.datagen.lines()
fig = df.iplot(asFigure=True, kind='scatter',
xTitle='Dates',yTitle='Returns',title='Returns',
vspan={'x0':'2015-01-11','x1':'2015-02-22','color':'rgba(30,30,30,0.3)','fill':True,'opacity':.4})
### ANSWER ###
xStart = ['2015-01-11', '2015-02-08', '2015-03-08', '2015-04-05']
xStop = ['2015-01-25', '2015-02-22', '2015-03-22', '2015-04-10']
def multiShades(plot, x0, x1):
""" Adds shaded areas for specified dates in a plotly plot.
The lines of the areas are set to transparent using rgba(0,0,0,0)
"""
# get start and end dates
x0 = xStart
x1 = xStop
# get dict from tuple made by vspan()
xElem = fig['layout']['shapes'][0]
# container (list) for dicts / shapes
shp_lst=[]
# make dicts according to x0 and X1
# and edit elements of those dicts
for i in range(0,len(x0)):
shp_lst.append(copy.deepcopy(xElem))
shp_lst[i]['x0'] = x0[i]
shp_lst[i]['x1'] = x1[i]
shp_lst[i]['line']['color'] = 'rgba(0,0,0,0)'
# replace shape in fig with multiple new shapes
fig['layout']['shapes']= tuple(shp_lst)
return(fig)
fig = multiShades(plot=fig, x0=xStart, x1=xStop)
iplot(fig)
一些细节:
函数 vspan
'fills' 元组 fig['layout']['shapes']
具有以下形式的字典:
{'fillcolor': 'rgba(187, 187, 187, 0.4)',
'line': {'color': '#BBBBBB', 'dash': 'solid', 'width': 1},
'type': 'rect',
'x0': '2015-01-11',
'x1': '2015-02-22',
'xref': 'x',
'y0': 0,
'y1': 1,
'yref': 'paper'}
我的函数只是获取该字典,制作多个副本,根据函数参数编辑这些副本,然后用函数中的新元组替换原始元组。
挑战:
当添加更多形状时,此方法可能会有点棘手。此外,日期必须是硬编码的——至少在有人找到
的答案之前
您现在可以使用 plotly 4.12 中添加的 fig.add_vrect() 来执行此操作。
例如,要添加对应于白天时间的阴影区域,有一个列表,morning,指定每天的早上时间,然后:
for morning in mornings:
fig.add_vrect(
x0=morning,
x1=morning + timedelta(hours=12),
fillcolor="white",
opacity=0.1,
line_width=0,
)
仅使用 plot.ly 中的这几行代码,您将在 jupyter notebook 中得到下面的图:
片段 1:
import plotly
import cufflinks as cf
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
init_notebook_mode(connected=True)
iplot(cf.datagen.lines().iplot(asFigure=True,
kind='scatter',xTitle='Dates',yTitle='Returns',title='Returns'))
情节 1:
如何设置才能使下图中的背景颜色交替变化,就像
Here's a link 解释了如何像这样添加阴影区域:
片段 2:
df.iplot(vspan={'x0':'2015-02-15','x1':'2015-03-15','color':'rgba(30,30,30,0.3)','fill':True,'opacity':.4},
filename='cufflinks/custom-regions')
情节 2:
感谢您的任何建议!
正如问题中所建议的,一个可能的解决方案可能在于 vspan
函数。但是,与使用 vspan
和 x 轴的情况相比,使用 hspan
为 y 轴添加多个阴影区域似乎要容易得多。后者需要更多调整。在我建议的解决方案之后可以找到更多详细信息。
下面的图是由下面的片段和函数 multiShades
生成的:
剧情:
片段:
### Setup from the question ###
import plotly
import cufflinks as cf
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
import pandas as pd
import numpy as np
from IPython.display import HTML
from IPython.core.display import display, HTML
import copy
# setup
init_notebook_mode(connected=True)
np.random.seed(123)
cf.set_config_file(theme='pearl')
# Random data using cufflinks
df = cf.datagen.lines()
fig = df.iplot(asFigure=True, kind='scatter',
xTitle='Dates',yTitle='Returns',title='Returns',
vspan={'x0':'2015-01-11','x1':'2015-02-22','color':'rgba(30,30,30,0.3)','fill':True,'opacity':.4})
### ANSWER ###
xStart = ['2015-01-11', '2015-02-08', '2015-03-08', '2015-04-05']
xStop = ['2015-01-25', '2015-02-22', '2015-03-22', '2015-04-10']
def multiShades(plot, x0, x1):
""" Adds shaded areas for specified dates in a plotly plot.
The lines of the areas are set to transparent using rgba(0,0,0,0)
"""
# get start and end dates
x0 = xStart
x1 = xStop
# get dict from tuple made by vspan()
xElem = fig['layout']['shapes'][0]
# container (list) for dicts / shapes
shp_lst=[]
# make dicts according to x0 and X1
# and edit elements of those dicts
for i in range(0,len(x0)):
shp_lst.append(copy.deepcopy(xElem))
shp_lst[i]['x0'] = x0[i]
shp_lst[i]['x1'] = x1[i]
shp_lst[i]['line']['color'] = 'rgba(0,0,0,0)'
# replace shape in fig with multiple new shapes
fig['layout']['shapes']= tuple(shp_lst)
return(fig)
fig = multiShades(plot=fig, x0=xStart, x1=xStop)
iplot(fig)
一些细节:
函数 vspan
'fills' 元组 fig['layout']['shapes']
具有以下形式的字典:
{'fillcolor': 'rgba(187, 187, 187, 0.4)',
'line': {'color': '#BBBBBB', 'dash': 'solid', 'width': 1},
'type': 'rect',
'x0': '2015-01-11',
'x1': '2015-02-22',
'xref': 'x',
'y0': 0,
'y1': 1,
'yref': 'paper'}
我的函数只是获取该字典,制作多个副本,根据函数参数编辑这些副本,然后用函数中的新元组替换原始元组。
挑战:
当添加更多形状时,此方法可能会有点棘手。此外,日期必须是硬编码的——至少在有人找到
您现在可以使用 plotly 4.12 中添加的 fig.add_vrect() 来执行此操作。 例如,要添加对应于白天时间的阴影区域,有一个列表,morning,指定每天的早上时间,然后:
for morning in mornings:
fig.add_vrect(
x0=morning,
x1=morning + timedelta(hours=12),
fillcolor="white",
opacity=0.1,
line_width=0,
)