code: def test_visualization_cmp_classifiers_predictions_distribution_output_saved(
      csv_filename,
  ):
      """Ensure pdf and png figures from the experiments can be saved.
  
      :param csv_filename: csv fixture from tests.conftest.csv_filename
      :return: None
      """
      input_features = [category_feature(encoder={"vocab_size": 10})]
      output_features = [
          category_feature(
              decoder={"vocab_size": 2}, reduce_input="sum"
          )
      ]
  
      # Generate test data
      rel_path = generate_data(
          input_features, output_features, csv_filename
      )
      exp_dir_name = run_experiment_with_visualization(
          input_features, output_features, dataset=rel_path
      )
      vis_output_pattern_pdf = os.path.join(exp_dir_name, "*.pdf")
      vis_output_pattern_png = os.path.join(exp_dir_name, "*.png")
      output_feature_name = get_output_feature_name(exp_dir_name)
      prediction = os.path.join(
          exp_dir_name, PREDICTIONS_PARQUET_FILE_NAME
      )
      experiment_source_data_name = csv_filename.split(".")[0]
      ground_truth = experiment_source_data_name + ".csv"
      split_file = experiment_source_data_name + ".split.parquet"
      test_cmd_pdf = [
          "python",
          "-m",
          "ludwig.visualize",
          "--visualization",
          "compare_classifiers_predictions_distribution",
          "--ground_truth",
          ground_truth,
          "--output_feature_name",
          output_feature_name,
          "--split_file",
          split_file,
          "--ground_truth_metadata",
          exp_dir_name + "/model/training_set_metadata.json",
          "--predictions",
          prediction,
          prediction,
          "--model_names",
          "Model1",
          "Model2",
          "-od",
          exp_dir_name,
      ]
      test_cmd_png = test_cmd_pdf.copy() + ["-ff", "png"]
  
      commands = [test_cmd_pdf, test_cmd_png]
      vis_patterns = [vis_output_pattern_pdf, vis_output_pattern_png]
  
      for command, viz_pattern in zip(commands, vis_patterns):
          result = subprocess.run(command)
          figure_cnt = glob.glob(viz_pattern)
  
          assert 0 == result.returncode
          assert 1 == len(figure_cnt)
  
imports: import glob
  import json
  import os
  import random
  import subprocess
  import numpy
  import pytest
  from ludwig.constants import BATCH_SIZE, ENCODER, TRAINER, TYPE
  from ludwig.experiment import experiment_cli
  from ludwig.globals import DESCRIPTION_FILE_NAME, PREDICTIONS_PARQUET_FILE_NAME, TEST_STATISTICS_FILE_NAME
  from ludwig.utils.data_utils import get_split_path
  from ludwig.visualize import _extract_ground_truth_values
  from tests.integration_tests.test_visualization_api import obtain_df_splits
  from tests.integration_tests.utils import bag_feature, binary_feature, category_feature, generate_data, number_feature, sequence_feature, set_feature, text_feature
label_desc: Use image node_id 15 for calling a global function with example usage: test_visualization_cmp_classifiers_predictions_distribution_output_saved(csv_filename) without return types