Files
CavinHuang-comfyui-nodes-docs/docs/XY Plot.md
2024-07-04 08:39:03 +08:00

6.4 KiB

Documentation

XY Plot节点旨在生成和操作XY图表,基于各种参数和条件。它支持多种操作,如翻转坐标轴、调整标签方向、缓存模型以及处理图表生成的唯一标识符。这个节点在处理和可视化结构化XY图表格式的数据方面非常灵活,可以适应不同类型的图表输入和配置。

Input types

Required

  • grid_spacing
    • 指定图表中网格线之间的间距,影响图表的粒度和视觉密度。
    • Comfy dtype: INT
    • Python dtype: int
  • XY_flip
    • 一个布尔参数,决定是否翻转X和Y轴,从而改变图表的方向。
    • Comfy dtype: COMBO[STRING]
    • Python dtype: bool
  • Y_label_orientation
    • 控制Y轴标签的方向,根据图表的布局和呈现方式增强可读性。
    • Comfy dtype: COMBO[STRING]
    • Python dtype: str
  • cache_models
    • 指示是否缓存模型数据以提高效率,减少重复生成图表时的加载时间。
    • Comfy dtype: COMBO[STRING]
    • Python dtype: bool
  • ksampler_output_image
    • 来自ksampler的输出图像,用作XY图表的参考或基础。
    • Comfy dtype: COMBO[STRING]
    • Python dtype: str

Optional

  • dependencies
    • 图表生成所需的可选依赖项,如额外的数据源或配置。
    • Comfy dtype: DEPENDENCIES
    • Python dtype: Dict[str, Any]
  • X
    • 图表的X轴值或数据点,如果连接了可以解包为元组。
    • Comfy dtype: XY
    • Python dtype: Tuple[float, ...]
  • Y
    • 图表的Y轴值或数据点,与X类似,如果连接了可以解包为元组。
    • Comfy dtype: XY
    • Python dtype: Tuple[float, ...]

Output types

  • SCRIPT
    • 返回一个包含XY图表脚本配置的字典,包括图表参数和数据点。
    • Comfy dtype: SCRIPT
    • Python dtype: Dict[str, Any]

Usage tips

  • Infra type: CPU
  • Common nodes:
    • [KSampler SDXL (Eff.)](../../efficiency-nodes-comfyui/Nodes/KSampler SDXL (Eff.).md)

Source code

class TSC_XYplot:

    @classmethod
    def INPUT_TYPES(cls):
        return {"required": {
                    "grid_spacing": ("INT", {"default": 0, "min": 0, "max": 500, "step": 5}),
                    "XY_flip": (["False","True"],),
                    "Y_label_orientation": (["Horizontal", "Vertical"],),
                    "cache_models": (["True", "False"],),
                    "ksampler_output_image": (["Images","Plot"],),},
                "optional": {
                    "dependencies": ("DEPENDENCIES", ),
                    "X": ("XY", ),
                    "Y": ("XY", ),},
                "hidden": {"my_unique_id": "UNIQUE_ID"},
        }

    RETURN_TYPES = ("SCRIPT",)
    RETURN_NAMES = ("SCRIPT",)
    FUNCTION = "XYplot"
    CATEGORY = "Efficiency Nodes/Scripts"

    def XYplot(self, grid_spacing, XY_flip, Y_label_orientation, cache_models, ksampler_output_image, my_unique_id,
               dependencies=None, X=None, Y=None):

        # Unpack X & Y Tuples if connected
        if X != None:
            X_type, X_value  = X
        else:
            X_type = "Nothing"
            X_value = [""]
        if Y != None:
            Y_type, Y_value = Y
        else:
            Y_type = "Nothing"
            Y_value = [""]

        # If types are the same exit. If one isn't "Nothing", print error
        if X_type != "XY_Capsule" and (X_type == Y_type) and X_type not in ["Positive Prompt S/R", "Negative Prompt S/R"]:
            if X_type != "Nothing":
                print(f"{error('XY Plot Error:')} X and Y input types must be different.")
            return (None,)

        # Check that dependencies are connected for specific plot types
        encode_types = {
            "Checkpoint", "Refiner",
            "LoRA", "LoRA Batch", "LoRA Wt", "LoRA MStr", "LoRA CStr",
            "Positive Prompt S/R", "Negative Prompt S/R",
            "AScore+", "AScore-",
            "Clip Skip", "Clip Skip (Refiner)",
            "ControlNetStrength", "ControlNetStart%", "ControlNetEnd%"
        }

        if X_type in encode_types or Y_type in encode_types:
            if dependencies is None:  # Not connected
                print(f"{error('XY Plot Error:')} The dependencies input must be connected for certain plot types.")
                # Return None
                return (None,)

        # Check if both X_type and Y_type are special lora_types
        lora_types = {"LoRA Batch", "LoRA Wt", "LoRA MStr", "LoRA CStr"}
        if (X_type in lora_types and Y_type not in lora_types) or (Y_type in lora_types and X_type not in lora_types):
            print(
                f"{error('XY Plot Error:')} Both X and Y must be connected to use the 'LoRA Plot' node.")
            return (None,)

        # Clean Schedulers from Sampler data (if other type is Scheduler)
        if X_type == "Sampler" and Y_type == "Scheduler":
            # Clear X_value Scheduler's
            X_value = [(x[0], "") for x in X_value]
        elif Y_type == "Sampler" and X_type == "Scheduler":
            # Clear Y_value Scheduler's
            Y_value = [(y[0], "") for y in Y_value]

        # Embed information into "Scheduler" X/Y_values for text label
        if X_type == "Scheduler" and Y_type != "Sampler":
            # X_value second tuple value of each array entry = None
            X_value = [(x, None) for x in X_value]

        if Y_type == "Scheduler" and X_type != "Sampler":
            # Y_value second tuple value of each array entry = None
            Y_value = [(y, None) for y in Y_value]

        # Clean VAEs from Checkpoint data if other type is VAE
        if X_type == "Checkpoint" and Y_type == "VAE":
            # Clear X_value VAE's
            X_value = [(t[0], t[1], None) for t in X_value]
        elif Y_type == "VAE" and X_type == "Checkpoint":
            # Clear Y_value VAE's
            Y_value = [(t[0], t[1], None) for t in Y_value]

        # Flip X and Y
        if XY_flip == "True":
            X_type, Y_type = Y_type, X_type
            X_value, Y_value = Y_value, X_value
            
        # Define Ksampler output image behavior
        xyplot_as_output_image = ksampler_output_image == "Plot"

        # Pack xyplot tuple into its dictionary item under script
        script = {"xyplot": (X_type, X_value, Y_type, Y_value, grid_spacing, Y_label_orientation, cache_models,
                        xyplot_as_output_image, my_unique_id, dependencies)}

        return (script,)