【问题标题】:plotly.py: change line opacity, leave markers opaqueplotly.py:改变线条不透明度,使标记不透明
【发布时间】:2022-05-01 02:12:53
【问题描述】:

是否可以更改线条不透明度但不能更改标记不透明度? 我发现我可以设置整行的不透明度,包括标记(opacity = .5)和标记之一(例如marker={"opacity":1})。

如本例所示:

import plotly
import plotly.graph_objs as go
plotly.offline.init_notebook_mode(connected=True)  # I'm running in a jupyter notebook

x = np.arange(0,10)
ys = [np.random.rand(10) for _ in range(3)]

lines = []
for y in ys:
    line = go.Scatter(x=x, y=y, mode="markers+lines", opacity=.5, marker={'symbol': 'x', 'size': "15", "opacity":1})
    lines.append(line)           
fig = go.Figure(
    data=lines,
    layout=go.Layout(showlegend=True)
)
plotly.offline.iplot(fig)

在此处查看结果:

我的问题如下:我的数据点很重要,线条只是视觉辅助。我想让线条 .5 不透明,但标记完全不透明。
但是,当我设置opacity=.5, marker={'opacity':1} 时,标记的不透明度也会降低。 (我相信标记不透明度是在[0, line-opacity] 范围内定义的。

有什么方法可以让我获得线条的颜色并调整它的不透明度(甚至在创建线条之后,但在绘制它之前)。 我知道我可以创建两条迹线,一条带有点,一条带有线。但是,我希望它们是相同的颜色,而不必手动指定颜色。 (痕迹的数量是不同的,所以我更喜欢坚持分配不同颜色的标准机制)

编辑:我目前的解决方案是将线宽设置为 0.5,这样它看起来更好,但显然这个解决方案对我有用,可能对人们没有用谁想要粗体和不那么不透明的线条。

编辑:有关此问题/功能请求/行为的 Github 问题: https://github.com/plotly/plotly.js/issues/2684

【问题讨论】:

  • 似乎是一个错误,因为父属性仍在更新为子属性,即使子属性已设置,您可以与 plotly 团队一起提出吗?您是否对具有两条迹线(一条用于标记,一条用于线)的解决方案感兴趣?
  • @NarenMurali 我认为这两条痕迹是备份。我发帖是因为我对“官方”解决方案感兴趣。
  • 作为后备,请提出问题票here,他们可能会给出一些建议,但我认为如果他们指定标记的不透明度,他们应该忽略跟踪的不透明度!

标签: python plotly opacity


【解决方案1】:

TL;DR - 可以使用: line=dict(color='rgba(255, 0, 0, 0.5)') - 来自@david Parks 的示例

线条对象没有 opacity 属性,但您可以使用 RGBA 分配颜色并设置 alpha。您必须使用 RGBA 为 ma​​rkers 分配颜色,否则它将继承该行。

在下面的示例中,我创建了三个随机颜色的随机线。然后我为标记和线条分配相同的颜色,但使用字符串连接来更改线条与标记的不透明度。标记将完全不透明,而线条将 80% 透明。

import plotly
import numpy as np
import plotly.graph_objs as go

plotly.offline.init_notebook_mode(connected=True)
x = np.arange(0,10)
ys = [np.random.rand(10) for _ in range(3)]

lines = []
dots = []
for y in ys:
    my_color = ('rgba('+str(np.random.randint(0, high = 256))+','+
                str(np.random.randint(0, high = 256))+','+
                str(np.random.randint(0, high = 256)))
    # my_color := "rgba( 143, 82, 244"
    line = go.Scatter(
            x=x, 
            y=y, 
            mode="lines+markers", 
            marker={ 
                    'symbol': 'x', 
                    'size': "15", 
                    'color':my_color+',1)' # "rgba( 143, 82, 244,1)"
                    },
            line={
                "color":my_color+',0.2)'
            })
    lines.append(line)  

fig = go.Figure(
    data=lines,
    layout=go.Layout(showlegend=True)
)
plotly.offline.iplot(fig)

【讨论】:

  • 您的解决方案不起作用(至少对我而言)。文档没有提到 opacity 作为该行的属性,并且尝试设置它会导致 PlotlyDictKeyError: 'opacity' is not allowed in 'line'
  • @iwileczek 这行得通,但使标记与线的颜色不同。在获得选定的线条颜色并对其应用 rgba 变换之后,将此步骤作为一种后处理形式来执行会很有趣。另请查看 Github 问题,其中我请求了官方功能,而无需手动设置一般颜色。
  • 您可以通过连接字符串使它们相同。查看修改。
  • 一个简化的例子:line=dict(color='rgba(255, 0, 0, 0.5)') 创建一条红线,半透明度。
【解决方案2】:

这是我找到的最佳答案的链接: https://github.com/plotly/plotly.js/issues/2684#issuecomment-641023041 ,您可以在其中使用函数将十六进制格式下的颜色转换为 rgba 格式,从而可以在其他答案中提到的最后一个参数上定义 alpha 不透明度。

def hex_to_rgba(h, alpha):
    '''
    converts color value in hex format to rgba format with alpha transparency
    '''
    return tuple([int(h.lstrip('#')[i:i+2], 16) for i in (0, 2, 4)] + [alpha])

然后你就可以用它了

import plotly.graph_objects as go
import plotly.express as px
COLORS = px.colors.qualitative.D3

hex_color = COLORS[0]  # Blue

traces = [
    go.Scatter(
        x=[0, 1],
        y=[0, 1],
        name='Identity line',
        showlegend=False,
        line=dict(
            color='rgba' + str(hex_to_rgba(
                h=hex_color,
                alpha=0.25
            )),
            width=2,
            dash='dash'
        ),
        marker=dict(
            size=7,
            symbol='circle',
            color='rgba' + str(hex_to_rgba(
                h=hex_color,
                alpha=1
            ))
        ),
    )
]

layout = go.Layout(template='simple_white')
figure = go.Figure(data=traces, layout=layout)
figure.show()

所以这里的蓝色:hex 格式是 '#1F77B4' 和 rgba 格式是 'rgba(31, 119, 180, 0.5)'

【讨论】:

    猜你喜欢
    • 2012-07-23
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 2011-09-10
    • 2012-12-09
    • 1970-01-01
    • 2022-08-23
    • 2016-12-02
    相关资源
    最近更新 更多