问题

我正在try 创建一个Ploly图表,我想在其中应用条件不透明度,如果一个条目被选中(列‘选定’:真或假)或没有.不幸的是,我try 的事情并没有奏效.如何将条件不透明度应用于我的Ploly图表?

我所try 的

我试图将数据帧的"不透明度"值传递给px.scatter()opacity参数,这导致了ValueError.

我还try 用product_fig.update_traces(marker=dict(opacity=df['opacity'].tolist()))更新轨迹,不幸的是,这也不起作用,也没有将不透明度应用于散点图中的点.

代码

import pandas as pd
import plotly.express as px

def build_product_data_fig(df: pd.DataFrame) -> go.Figure:

    df['opacity'] = df['selected'].apply(lambda x: 0.8 if x else 0.2)

    product_fig = px.scatter(df,
                             x='emission',
                             y='weight_gram',
                             color='category',
                             size='price',
                             template='plotly_dark')

    return product_fig

样本数据

emission weight_gram category selected price
120.4 1250 A True 32.0
92.0 950 B False 20.0
105.5 1100 A True 25.0
87.8 800 B False 18.0
100.2 1050 A False 22.0
110.6 1150 A True 28.0
95.2 900 B False 16.0
115.8 1200 A True 30.0

推荐答案

我首先为类别创建了一个RGB colored颜色 映射,从而获得了我想要的解决方案.然后,我通过创建相应的RGBA值并添加基于selected列的相关不透明度,将不透明度添加到 colored颜色 贴图中.

import colorsys
import pandas as pd
import plotly.graph_objects as go

def create_color_list(df: pd.DataFrame) -> List[str]:
    
    unique_categories = df['category'].unique()
    category_color_map = {}

    num_categories = len(unique_categories)
    color_map = []
    for i in range(num_categories):
        hue = i / num_categories
        rgb = tuple(round(i * 255) for i in colorsys.hsv_to_rgb(hue, 0.7, 0.9))
        color_map.append(rgb)

    for i, category in enumerate(unique_categories):
        category_color_map[category] = color_map[i % len(color_map)]

    color_list = []
    for category, selected in df[['category', 'selected']].values:
        if selected:
            opacity = 0.8
        else:
            opacity = 0.2
        color = category_color_map[category]
        rgba = f"rgba({color[0]}, {color[1]}, {color[2]}, {opacity})"
        color_list.append(rgba)
        
    return color_list


def build_product_data_fig(df: pd.DataFrame, color_list: List[str]) -> go.Figure:

    product_fig = go.Figure()
    product_fig.add_trace(go.Scatter(mode='markers',
                                     x=df['emission'],
                                     y=df['weight_gram'],
                                     marker=dict(
                                         color=color_list,
                                         size=df['price'] / 40)
                                     ))

    product_fig.update_layout(template='plotly_dark')

    return product_fig

color_list = create_color_list(df)
product_fig = build_product_data_fig(df, color_list)
product_fig.show()

Python相关问答推荐

将C struct 的指针传递给Python中的ioctel

Tkinter -控制调色板的位置

阅读Polars Python中管道的函数定义

指示组内的rejected_time是否在creation_timestamp后5分钟内

如何在Python中使用时区夏令时获取任何给定本地时间的纪元值?

根据给定日期的状态过滤查询集

当密钥是复合且唯一时,Pandas合并抱怨标签不唯一

如何在Deliveryter笔记本中从同步上下文正确地安排和等待Delivercio代码中的结果?

时间序列分解

在Python中处理大量CSV文件中的数据

如何使用matplotlib在Python中使用规范化数据和原始t测试值创建组合热图?

如何让剧作家等待Python中出现特定cookie(然后返回它)?

切片包括面具的第一个实例在内的眼镜的最佳方法是什么?

当从Docker的--env-file参数读取Python中的环境变量时,每个\n都会添加一个\'.如何没有额外的?

如何使用它?

从一个系列创建一个Dataframe,特别是如何重命名其中的列(例如:使用NAs/NaN)

isinstance()在使用dill.dump和dill.load后,对列表中包含的对象失败

与命令行相比,相同的Python代码在Companyter Notebook中运行速度慢20倍

无论输入分辨率如何,稳定扩散管道始终输出512 * 512张图像

Numpyro AR(1)均值切换模型抽样不一致性