python 在函数调用中绘制多个数据值

rlcwz9us  于 2022-11-21  发布在  Python
关注(0)|答案(2)|浏览(125)

在调用*args参数解压缩(x,y)输入值后,我想在函数内部绘制散点图的多个子图。但是,我总是得到一个简单的错误:
ValueError:s必须是标量或类似浮点数组的值,其大小与x和y相同
即使将函数改为args的替代顺序,我似乎也无法解决这个问题。

import pandas as pd
import numpy as np
from matplotlib.pyplot import plt

x = np.array([[1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4], 
              [0.3, 0.5, 0.6, 0.2, 0.4, 0.5, 0.6, 0.5, 0.8, 0.9, 0.9, 0.8, 0.2, 0.1, 0.5, 0.6],
              ['r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b']])

values = pd.DataFrame(x.T, columns=['a', 'b', 'c'])

X = values[values['c'] == 'r'].iloc[ : , 0:2 ].values
Y = values[values['c'] == 'b'].iloc[ : , 0:2 ].values

def test(*args):
    figs, axs = plt.subplots( 1 , 2 , figsize = ( 8 , 8 ) )
    for xy , ax in zip( args , axs.flat ) :
        print(xy)
        ax.scatter(*xy)

test(X, Y)

plt.show()
siotufzp

siotufzp1#

我已经实现了它与以下,所以也许有一个更干净的替代品?

def test(*args):
    figs, axs = plt.subplots( 1 , 2 , figsize = ( 8 , 8 ) )
    xy = np.array(args)
    for x_y , ax in zip( xy , axs.flat ) :
        (x, y) = np.hsplit(np.ndarray.flatten(x_y), 2)
        ax.scatter(x, y)

test(X, Y)

plt.show()
tjjdgumg

tjjdgumg2#

好吧...这就是你的问题的解决方案...这可能和你的代码一样难以理解。

def t(*args):
    figs, axs = plt.subplots( 1 , 2 , figsize = ( 8 , 8 ) )
    for xy , ax in zip( zip(*args) , axs.flat ) :
        print(xy)
        ax.scatter(*xy)

t(X.transpose(), Y.transpose())

现在,让我们将其转换为python代码......只需查看函数,您就应该了解有关函数的所有信息,因此 *args对于函数预期行为之外的“额外”内容非常有用。
1.将X和Y与args分开,因为它们在函数内部显式使用。
1.避免zip,除非参数很简单,虽然嵌套生成器性能很好,但它对代码质量不好,在你的情况下,我会选择enumerate,因为我正在索引到一个数组,它需要尽可能具有描述性。
1.让你的调用描述性的,*xy不是描述性的,这个变量是什么?它是一个元组?一个ndarray?解包它会得到什么结果?如果你在里面传递X和Y,那么直接传递X和Y。

def t(*args):
    X,Y = args
    figs, axs = plt.subplots(1, 2, figsize=(8, 8))
    for i, ax in enumerate(axs):
        print(X[:, i], Y[:, i])
        ax.scatter(X[:, i], Y[:, i])

t(X, Y)

相关问题