如何向要求传入嵌套元组的Python绘图函数传入单个二元组参数
问题原因
你遇到的报错本质是参数传递逻辑不匹配:
- 原函数设计的
xy参数需要接收包含多个二元组的外层容器(比如你默认用的var_combinations,结构是((x1,y1), (x2,y2))) - 你直接调用
create_plot(('a','b'), ('c','d'))时,第一个二元组('a','b')被赋值给了xy参数,第二个二元组('c','d')被错误赋值给了logged参数。此时xy本身是长度为2的字符串元组,遍历xy时会依次取出两个字符串,尝试把单个字符串拆成x,y两个变量就会触发解包错误。
修复方案
有两种修复方式,你可以根据使用习惯选择:
方式1:修改函数参数定义(更符合你期望的调用方式)
直接把函数改成支持接收任意多个二元组作为位置参数,原有绘图、标题、坐标轴逻辑完全不需要改动:
# 修改函数定义,用*xy接收任意多个位置参数的xy对 def create_plot(*xy, logged=False): # 新增默认值逻辑:如果没有传任何xy参数,就用默认的组合 if not xy: col_names = [list(data.columns)[4], list(data.columns)[3], list(data.columns)[1]] xy = tuple(itertools.combinations(col_names, 2)) if not logged: fig1, axs1 = plt.subplots(1, (len(xy)), figsize=(16, 5)) # 后面的循环、绘图逻辑完全不变 for i, (x, y) in enumerate(xy): axs1[i].scatter(data[x], data[y], c=taxon.map(colors), edgecolor='k') axs1[i].set( title=f'Primate {xy[i][0]} against\n{xy[i][1]}', xlabel=f'{xy[i][0]}', ylabel=f'{xy[i][1]}' ) elif logged: # 原有逻辑保持不变 ...
修改后你就可以用期望的方式调用:
create_plot(('Cerebellum Surface Area', 'Cerebrum Volume'), ('etc', 'etc'))
方式2:不修改函数,调整调用写法
如果你不想改动现有函数,只需要把自定义的所有xy对套在一个外层的元组/列表里传入即可:
# 把所有二元组放到同一个外层容器里传入 create_plot([('Cerebellum Surface Area', 'Cerebrum Volume'), ('etc', 'etc')])
额外注意事项
你提供的CSV列名自带多余空格(比如CerebellumVolume 末尾带空格),传入自定义列名时需要和data.columns里的实际列名完全一致,否则会触发KeyError。
内容的提问来源于stack exchange,提问作者jaishi
相关产品推荐
相关产品推荐

