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(图文并茂版!!!)