Plotly:条形图不透明度随时间范围的变化而变化
Plotly: Bar chart opacity changes with longer time range
我注意到绘制不同的时间尺度会导致叠加条形图的不透明度变淡。我该如何纠正这个问题?在第一张图片中,我绘制了 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()
Opacity lower than expected:
Opacity normal:
它没有改变不透明度,但它试图在给定的绘图区域中绘制大量条形图。尝试放大并查看差异。还尝试使用以下方法更改图的宽度:
fig.update_layout(宽度=2500)
更改辅助轴范围使用:
fig.update_layout(yaxis2_range=[lower_range,upper_range])
简答:
这与不透明度无关。有关更多详细信息,请查看下面的完整答案。要在具有大量和少量观察值的图形之间获得一致性,您必须将条形线的宽度设置为零,并将条形间隙设置为零,就像在下一个代码片段中一样。使用 rgba(0,0,250,0)
之类的颜色,您还可以 select 通过最后一位设置任何您想要的不透明度。
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,
)
图 1a - 很少观察
图 1b - 许多观察结果
详情:
这与opacity
无关。你要求 plotly 建立一个条形图,显然 barplots 根据 plotly must 在条形之间有一个 space 。所以对于一些观察你会得到这个:
对于许多观察结果,正如您所展示的,您会得到:
条形图的颜色没有改变,但看起来是这样,因为 plotty 挤进了一点 space 以进行更多观察。
我最初认为这可以通过以下方式修改:
fig.update_layout(bargap=0,
bargroupgap = 0,
)
但是没有:
为了提高较小和较大 selectoins 之间的一致性,您必须 select 条形填充颜色与条形线条颜色相同,例如 blue
.
fig.update_traces(marker_color='blue',
marker_line_color='blue',
selector=dict(type="bar"))
但如果放大,条形图之间仍然存在一点颜色差异:
对于较浅的颜色,这会变得更清晰:
但事实证明最好的解决方案是设置 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()
我注意到绘制不同的时间尺度会导致叠加条形图的不透明度变淡。我该如何纠正这个问题?在第一张图片中,我绘制了 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()
Opacity lower than expected:
Opacity normal:
它没有改变不透明度,但它试图在给定的绘图区域中绘制大量条形图。尝试放大并查看差异。还尝试使用以下方法更改图的宽度: fig.update_layout(宽度=2500)
更改辅助轴范围使用: fig.update_layout(yaxis2_range=[lower_range,upper_range])
简答:
这与不透明度无关。有关更多详细信息,请查看下面的完整答案。要在具有大量和少量观察值的图形之间获得一致性,您必须将条形线的宽度设置为零,并将条形间隙设置为零,就像在下一个代码片段中一样。使用 rgba(0,0,250,0)
之类的颜色,您还可以 select 通过最后一位设置任何您想要的不透明度。
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,
)
图 1a - 很少观察
图 1b - 许多观察结果
详情:
这与opacity
无关。你要求 plotly 建立一个条形图,显然 barplots 根据 plotly must 在条形之间有一个 space 。所以对于一些观察你会得到这个:
对于许多观察结果,正如您所展示的,您会得到:
条形图的颜色没有改变,但看起来是这样,因为 plotty 挤进了一点 space 以进行更多观察。
我最初认为这可以通过以下方式修改:
fig.update_layout(bargap=0,
bargroupgap = 0,
)
但是没有:
为了提高较小和较大 selectoins 之间的一致性,您必须 select 条形填充颜色与条形线条颜色相同,例如 blue
.
fig.update_traces(marker_color='blue',
marker_line_color='blue',
selector=dict(type="bar"))
但如果放大,条形图之间仍然存在一点颜色差异:
对于较浅的颜色,这会变得更清晰:
但事实证明最好的解决方案是设置 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()