0xC*_*ney 8 python plotly plotly-python
我注意到绘制不同的时间尺度会导致重叠条形图的不透明度褪色。我该如何纠正这个问题?在第一张图片中,我绘制了 2 年的时间范围,在第二张图片中,我绘制了 1 年的时间范围。请注意,前者有一个明显褪色的条形图,我希望这两个图表无论范围如何都是相同的。
旁注:我正在“破解”图表以主轴为中心,如果有人可以帮助我弄清楚如何直接设置辅助轴的 y 轴范围,这也会非常有帮助。
import plotly.graph_objects as go
from plotly.subplots import make_subplots
filtered = df[(df['date'] > '2017-1-24') & (df['date'] <= '2018-1-24')]
fig = make_subplots(specs=[[{"secondary_y": True}]])
fig.add_trace(
go.Bar(
x=filtered['date'],
y=filtered['divergence'],
opacity=0.5
)
)
fig.add_trace(
go.Scatter(
x=filtered['date'],
y=filtered['price'],
mode="lines"
),
secondary_y=True
)
fig.update_layout(yaxis_range=[-9, 9])
fig.show()
Run Code Online (Sandbox Code Playgroud)
ves*_*and 15
这与不透明度无关。有关更多详细信息,请查看下面的完整答案。为了获得具有许多观察值和很少观察值的数字之间的一致性,您必须将条形线的宽度设置为零,并将 bargap 设置为零,如下一个代码片段所示。使用类似的颜色rgba(0,0,250,0)还可以通过最后一位数字选择任何您想要的不透明度。
fig.update_traces(marker_color = 'rgba(0,0,250, 0.5)',
marker_line_width = 0,
selector=dict(type="bar"))
fig.update_layout(bargap=0,
bargroupgap = 0,
)
Run Code Online (Sandbox Code Playgroud)
这与 无关opacity。您要求情节地建立一个条形图,并且显然根据情节,条形图必须在条形之间有一个空格。因此,通过一些观察,您会得到以下结果:
对于许多观察,正如您所演示的,您将得到以下结果:
条形的颜色没有改变,但看起来像是这样,因为 plolty 挤压了一些空间来进行更多的观察。
我最初认为这可以通过以下方式修改:
fig.update_layout(bargap=0,
bargroupgap = 0,
)
Run Code Online (Sandbox Code Playgroud)
但不是:
为了提高较小和较大选择之间的一致性,您必须为条形填充选择与条形线条颜色相同的颜色,例如blue。
fig.update_traces(marker_color='blue',
marker_line_color='blue',
selector=dict(type="bar"))
Run Code Online (Sandbox Code Playgroud)
但如果放大的话,条形之间仍然存在一点色差:
对于较浅的颜色,这一点变得更加清晰:
但事实证明,最好的解决方案是 marker_line_width = 0像答案开头所述的设置。
import numpy as np
import pandas as pd
import plotly.graph_objects as go
import plotly.express as px
import datetime
from plotly.subplots import make_subplots
pd.set_option('display.max_rows', None)
# data sample
nperiods = 50
np.random.seed(123)
df = pd.DataFrame(np.random.randint(-10, 12, size=(nperiods, 2)),
columns=['price', 'divergence'])
datelist = pd.date_range(datetime.datetime(2017, 1, 1).strftime('%Y-%m-%d'),periods=nperiods).tolist()
df['date'] = datelist
df = df.set_index(['date'])
df.index = pd.to_datetime(df.index)
# df.iloc[0] =1000
# df = df.cumsum().reset_index()
df.reset_index(inplace=True)
df['price'] = df['price'].cumsum()
df['divergence'] = df['divergence'].cumsum()
filtered = df[(df['date'] > '2017-1-24') & (df['date'] <= '2018-1-24')]
fig = make_subplots(specs=[[{"secondary_y": True}]])
fig.add_trace(
go.Bar(
x=filtered['date'],
y=filtered['divergence'],
#opacity=0.5
)
)
fig.add_trace(
go.Scatter(
x=filtered['date'],
y=filtered['price'],
mode="lines"
),
secondary_y=True
)
fig.update_traces(marker_color = 'rgba(0,0,250, 0.5)',
marker_line_width = 0,
selector=dict(type="bar"))
fig.update_layout(bargap=0,
bargroupgap = 0,
)
fig.show()
Run Code Online (Sandbox Code Playgroud)