首页 文章

ValueError:提供'c' kwarg或'color' kwarg,但不能同时提供;它们不同但功能重叠

提问于
浏览
2

我试图在Python Data Science Essential一书中运行一个例子 . 但是,当我运行它时,它出现了错误 . 实际上,我刚开始学习python . 所以,我觉得修复这些错误很难 . 请帮我 . 这是代码:

In:
import pandas as pd
import numpy as np
In: colors = list()
In: palette = {0: "red", 1: "green", 2: "blue"}
In:
for c in np.nditer(iris.target): colors.append(palette[int(c)])
    # using the palette dictionary, we convert
    # each numeric class into a color string
In: dataframe = pd.DataFrame(iris.data,
columns=iris.feature_names)
In: scatterplot = pd.scatter_matrix(dataframe, alpha=0.3,
figsize=(10, 10), diagonal='hist', color=colors, marker='o',
grid=True)

这是错误:

ValueError Traceback(最近一次调用last)in()1 scatterplot = pd.scatter_matrix(dataframe,alpha = 0.3,----> 2 figsize =(10,10),diagonal ='hist',color = colors,marker ='o',grid = True)/Users/leeivan/anaconda/lib/python2.7/site-packages/pandas/tools/plotting.py in scatter_matrix(frame,alpha,figsize,ax,grid,diagonal,marker, density_kwds,hist_kwds,range_padding,** kwds)378 379 ax.scatter(df [b] [common],df [a] [common], - > 380 marker = marker,alpha = alpha,** kwds)381 382 ax.set_xlim(borders_list [j])/Users/leeivan/anaconda/lib/python2.7/site-packages/matplotlib/init.pyc in inner(ax,* args,** kwargs)1817 warnings.warn(msg% (label_namer,func.name),1818 RuntimeWarning,stacklevel = 2) - > 1819 return func(ax,* args,** kwargs)1820 pre_doc = inner.doc 1821如果pre_doc为None:/ Users / leeivan / anaconda / lib散点图中的/python2.7/site-packages/matplotlib/axes/_axes.pyc(self,x,y,s,c,marker,cmap,norm,vmin,vmax,alpha,linewidths,verts,edgecolors,** kwargs )3787 facecolors = c o 3788如果c不是None: - > 3789引发ValueError(“提供'c'kwarg或'color'kwarg”3790“但不是两者都有;它们不同,但“3791”它们的功能重叠 . “)ValueError:提供'c'kwarg或'color'kwarg但不是两者;它们不同但功能重叠 .

2 回答

  • 6

    所以我跟踪它,但这是我可以告诉你的 . kwarg 是将关键字参数传递给函数的时候 .

    scatterplot = pd.scatter_matrix(dataframe, alpha=0.3,figsize=(10, 10),diagonal='hist',color=colors, marker='o',grid=True)
    

    就在那里 color=colors 是一个关键字参数 . 现在在函数调用的某处,它看起来像 c 成为关键字参数 . 我不知道你怎么能改变它,但你可以摆脱你的 color Kwarg,这可能会解决现在的问题 . 否则,您需要查看堆栈跟踪中的那些函数,并找出 c 何时变为kwarg

  • -3

    我在jupyter和python 3.5中测试了下面的代码,它的工作原理 .

    import pandas as pd
    import numpy as np
    from sklearn.datasets import load_iris
    %matplotlib inline
    
    iris = load_iris()
    colors = list()
    palette = {0: "red", 1: "green", 2: "blue"}
    
    for c in np.nditer(iris.target): colors.append(palette[int(c)])
        # using the palette dictionary, we convert
        # each numeric class into a color string
    dataframe = pd.DataFrame(iris.data,
    columns=iris.feature_names)
    scatterplot = pd.scatter_matrix(dataframe, alpha=0.3,
    figsize=(10, 10), diagonal='hist', c=colors, marker='o', grid=True)
    

    显然,参数 color 正在生成错误,而 c 正在运行 . 另一方面,它可能是matplotlib中的一个错误 .

    这是我发现的,看看pandas功能:

    def scatter_matrix(frame, alpha=0.5, figsize=None, ax=None, grid=False,
                       diagonal='hist', marker='.', density_kwds=None,
                       hist_kwds=None, range_padding=0.05, **kwds):
        """
        Draw a matrix of scatter plots.
        Parameters
        ----------
        frame : DataFrame
        alpha : float, optional
            amount of transparency applied
        figsize : (float,float), optional
            a tuple (width, height) in inches
        ax : Matplotlib axis object, optional
        grid : bool, optional
            setting this to True will show the grid
        diagonal : {'hist', 'kde'}
            pick between 'kde' and 'hist' for
            either Kernel Density Estimation or Histogram
            plot in the diagonal
        marker : str, optional
            Matplotlib marker type, default '.'
        hist_kwds : other plotting keyword arguments
            To be passed to hist function
        density_kwds : other plotting keyword arguments
            To be passed to kernel density estimate plot
        range_padding : float, optional
            relative extension of axis range in x and y
            with respect to (x_max - x_min) or (y_max - y_min),
            default 0.05
        kwds : other plotting keyword arguments
            To be passed to scatter function
    

    因此, colorsc 似乎被传递给 matplotlib 中的 scatter 函数,作为函数调用中的 **kwds 之一 .

    这是分散函数:

    matplotlib.pyplot.scatter(x, y, s=20, c=None, marker='o', cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, hold=None, data=None, **kwargs)
    

    这里的参数是 c 而不是 color ,但在其他部分 color 被列为 c 的替代品(如您所料) .

    我在matplotlib上发布了一个问题 . 我会随时通知你 .

    NEWS as of 11/12/2016

    经过一番讨论后,这个bug已被大熊猫接受并计划在下一个主要版本中修复 . 见here on github

    基本上,当指定 c 时, c 被发送到matplotlib中的 scatter 函数 . 指定 color 时,会发送 ccolor ,这会使matplotlib感到困惑 .

    按照建议的时间,使用 c 而不是 color

相关问题