code: def plot_3d(test, sorted_argnames):
      assert len(sorted_argnames) == 3
      num_graphs = len(set(test.args[sorted_argnames[0]]))
      num_rows = int(math.ceil(math.sqrt(num_graphs)))
      num_cols = int(math.ceil(num_graphs / num_rows))
      graphs = set(test.args[sorted_argnames[0]])
  
      for j, graph in enumerate(sorted(graphs, key=try_as_numeric)):
          ax = plt.subplot(num_rows, num_cols, j + 1)
          filtered_test = Test()
          indices = range(len(test.times))
          indices = list(
              filter(
                  lambda i: test.args[sorted_argnames[0]][i] == graph,
                  indices,
              )
          )
          filtered_test.times = [test.times[i] for i in indices]
          filtered_test.args[sorted_argnames[1]] = [
              test.args[sorted_argnames[1]][i] for i in indices
          ]
          filtered_test.args[sorted_argnames[2]] = [
              test.args[sorted_argnames[2]][i] for i in indices
          ]
          plot_2d(
              filtered_test,
              sorted_argnames[1:],
              ax,
              construct_name(sorted_argnames[0], graph),
          )
  
file_path: arrow/cpp/src/arrow/acero/hash_join_graphs.py
imports: import math
  import sys
  import json
  import matplotlib.pyplot
  import seaborn
label_desc: Use image node_id 7 for calling a global function with example usage: plot_3d(test, sorted_argnames) without return types