ValueError:FixedLocator 位置的数量 (5),通常来自对 set_ticks 的调用,与刻度标签的数量 (12) 不匹配

Posted

技术标签:

【中文标题】ValueError:FixedLocator 位置的数量 (5),通常来自对 set_ticks 的调用,与刻度标签的数量 (12) 不匹配【英文标题】:ValueError: The number of FixedLocator locations (5), usually from a call to set_ticks, does not match the number of ticklabels (12) 【发布时间】:2020-11-07 05:51:38 【问题描述】:

这段代码之前是可以工作的,但是,在创建一个新环境之后,它就停止工作了

plt.xticks(x, months, rotation=25,fontsize=8)

如果我注释了这一行,那么没有错误,在输入这​​一行之后会抛出错误

ValueError: The number of FixedLocator locations (5), usually from a call to set_ticks, does not match the number of ticklabels (12).

import numpy as np
import matplotlib.pyplot as plt

dataset = df
dfsize = dataset[df.columns[0]].size
x = []
for i in range(dfsize):
    x.append(i)

dataset.shape
# dataset.dropna(inplace=True)
dataset.columns.values
var = ""
for i in range(dataset.shape[1]):  ## 1 is for column, dataset.shape[1] calculate length of col

    y = dataset[dataset.columns[i]].values
    y = y.astype(float)
    y = y.reshape(-1, 1)
    y.shape
    from sklearn.impute import SimpleImputer

    missingvalues = SimpleImputer(missing_values=np.nan, strategy='mean', verbose=0)
    missingvalues = missingvalues.fit(y)
    y = missingvalues.transform(y[:, :])

    from sklearn.preprocessing import LabelEncoder, OneHotEncoder
    from sklearn.compose import ColumnTransformer

    labelencoder_x = LabelEncoder()
    x = labelencoder_x.fit_transform(x)

    from scipy.interpolate import *

    p1 = np.polyfit(x, y, 1)
    # from matplotlib.pyplot import *
    import matplotlib
    matplotlib.use('Agg')
    import matplotlib.pyplot as plt

    plt.figure()
    plt.xticks(x, months, rotation=25,fontsize=8)
    #print("-->"+dataset.columns[i])
    plt.suptitle(dataset.columns[i] + ' (xyz)', fontsize=10)
    plt.xlabel('month', fontsize=8)
    plt.ylabel('Age', fontsize=10)
    plt.plot(x, y, y, 'r-', linestyle='-', marker='o')
    plt.plot(x, np.polyval(p1, x), 'b-')
    y = y.round(decimals=2)
    for a, b in zip(x, y):
        plt.text(a, b, str(b), bbox=dict(facecolor='yellow', alpha=0.9))

    plt.grid()
    # plt.pause(2)
    # plt.grid()

    var = var + "," + dataset.columns[i]
    plt.savefig(path3 + dataset.columns[i] + '_1.png')
    plt.close(path3 + dataset.columns[i] + '_1.png')
    plt.close('all')

【问题讨论】:

您的错误似乎表明您使用的是不同的数据框。 dataset[df.columns[0]].size 现在是 5,而之前是 12。 是的,我明白了,但不明白为什么在此之前动态工作会发生变化。 好吧,你使用的是不同的数据框。 让我猜猜。您使用了 matplotlib 3.2.2 版,今天使用 matplotlib 3.3.0 创建了一个新环境。尽管我还没有找到确切的错误报告,但新版本中出现了一些问题。我建议在解决此问题之前恢复到 3.2.2。 Gregory Shimansky,你的建议似乎有效,我会试试这个,但目前我已经修复了这里报告的最新错误。早些时候我的 matplotlib 版本是 3.2.1,现在我有 3.3.0。 【参考方案1】:

我正在使用子图并遇到了同样的错误。我注意到如果重新标记的轴(在我的情况下是 y 轴)显示所有标签,错误就会消失。如果没有,则会出现您标记的错误。我建议增加图表高度,直到默认显示所有 y 轴标签(请参见下面的屏幕截图)。

或者,我建议使用ax.set_xticks(...) 定义FixedLocator 刻度位置,然后使用ax.set_xticklables(...) 设置标签。

Ever 2nd y-axis label drawn

Every y-axis label drawn and over-written with custom labels

【讨论】:

这对我也很好。首先,当然需要创建轴。 不幸的是,这个问题在 python 3.7.4 中再次出现(我在 Ubuntu 中使用 spyder 3.3.6),你的建议并没有解决它。我们是否可以重新考虑另一种解决方案?我有一个一年前没有问题的代码的确切问题,现在抛出了这个问题。谢谢! 我在 anaconda python 的 3.9.7 下过夜升级到 3.4.3 时遇到了同样的问题。 (在 OSX 下)有人有可靠的解决方案吗?【参考方案2】:

我还偶然发现了这个错误,发现让你的 xtick_labels 和 xticks 都成为等长的列表是可行的。所以在你的情况下是这样的:

def month(num):
  # returns month name based on month number


num_elements = len(x)
X_Tick_List = []
X_Tick_Label_List=[]

for item in range (0,num_elements):
    X_Tick_List.append(x[item])
    X_Tick_Label_List.append(month(item+1))

plt.xticks(ticks=X_Tick_List,labels=X_Tick_LabeL_List, rotation=25,fontsize=8)
       

【讨论】:

我尝试在 python 3.7.3 中解决这个问题(在 Ubuntu 中的 Spyder 3.3.6 中),但我正在绘制熊猫箱线图。是否可以重新考虑解决方案,因为上述情况似乎不适用于我的情况。谢谢【参考方案3】:

这些问题似乎有点老了,但我偶然发现了一个类似的问题:我的行也发生了同样的错误 ax.set(xticklabels=..., xticks=...) 在更新到 matplotlib 版本 3.2.2 之后一直运行良好。

某个轴的set方法似乎是按照set的参数顺序调用其他方法。在较旧的 matplotlib 版本中,在解压缩 set-arguments 之后,似乎有某种排序。

重新排列参数的顺序以便首先设置新的 xticks 数量为我解决了这个问题: ax.set(xticks=..., xticklabels=...)

【讨论】:

以上是关于ValueError:FixedLocator 位置的数量 (5),通常来自对 set_ticks 的调用,与刻度标签的数量 (12) 不匹配的主要内容,如果未能解决你的问题,请参考以下文章

解决警告:UserWarning: FixedFormatter should only be used together with FixedLocator(图文并茂版!!!)

ValueError:在 midi 中找不到子字符串

在 64 位 python 上训练的 Scikit-Learn 随机森林不会在 32 位 python 上打开

ValueError:未知标签类型

ValueError: '对象对于所需数组来说太深'

ValueError:不支持多类格式