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

Posted

技术标签:

【中文标题】ValueError: 提供 \'c\' kwarg 或 \'color\' kwarg 但不能同时提供;它们不同,但它们的功能重叠【英文标题】:ValueError: Supply a 'c' kwarg or a 'color' kwarg but not both; they differ but their functionalities overlapValueError: 提供 'c' kwarg 或 'color' kwarg 但不能同时提供;它们不同,但它们的功能重叠 【发布时间】:2017-03-17 00:53:32 【问题描述】:

我尝试运行 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(最近调用 最后)在() 1 散点图 = pd.scatter_matrix(数据框,alpha=0.3, ----> 2 figsize=(10, 10),对角线='hist', color=colors, marker='o',grid=True)

/Users/leeivan/anaconda/lib/python2.7/site-packages/pandas/tools/plotting.py 在 scatter_matrix(frame, alpha, figsize, ax, grid, 对角线, 标记, 密度_kwds, hist_kwds, range_padding, **kwds) 378 第379章 --> 380 标记=标记,alpha=alpha,**kwds) 381 第382章

/Users/leeivan/anaconda/lib/python2.7/site-packages/matplotlib/init.pyc 在内部(斧头,*args,**kwargs)1817 warnings.warn(msg % (label_namer, func.name), 1818 运行时警告,堆栈级别 = 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 在 scatter(self, x, y, s, c, marker, cmap, norm, vmin, vmax, alpha, 线宽、顶点、边缘颜色、**kwargs)3787 facecolors = co 3788 如果 c 不是无: -> 3789 raise ValueError("Supply a 'c' kwarg or a 'color' kwarg" 3790 " but not 两个都;他们不同,但“3791” 它们的功能重叠。”)

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

【问题讨论】:

如果您认为合适,在提供问题的解决方案和解释后,请在回答问题时勾选答案。谢谢! 【参考方案1】:

所以我现在在手机上,无法追踪到它,但我可以告诉你。 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

【讨论】:

当我删除 color=colors 时,示例运行肯定没有错误。但是,我希望用不同的颜色代表不同的类。所以,我需要继续找出原因。谢谢。【参考方案2】:

我在 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 似乎作为函数调用中的 **kwds 之一传递给 matplotlib 中的 scatter 函数。

这是散点函数:

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 上发布了一个问题。我会及时通知你的。

截至 2016 年 11 月 12 日的新闻

经过一番讨论,该漏洞已被 pandas 接受,并计划在下一个主要版本中修复。见here on github

基本上当c被指定时,c被发送到matplotlib中的scatter函数。当 color 被指定时,ccolor 都被发送,混淆了 matplotlib。

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

【讨论】:

以上是关于ValueError: 提供 'c' kwarg 或 'color' kwarg 但不能同时提供;它们不同,但它们的功能重叠的主要内容,如果未能解决你的问题,请参考以下文章

SMOTE为所有分类数据集提供数组大小/ ValueError

人脸识别:ValueError:allow_pickle=False 时无法加载对象数组

tensorflow-tf.group

ValueError:没有为任何变量提供梯度 - Tensorflow 2.0/Keras

TensorFlow 自定义损失 ValueError:“没有为任何变量提供渐变:[....'Layers'....]”

ValueError:无法为具有形状“(?,784)”的张量“x:0”提供形状(784,)的值