4 回答

TA貢獻1818條經驗 獲得超7個贊
解決方法:
避免警告的方法是使用 FixLocator (這是 matplotlib.ticker 的一部分)。下面我展示了繪制三個圖表的代碼。我以不同的方式格式化它們的軸。請注意,“set_ticks”使警告靜音,但它更改了實際的刻度位置/標簽(我花了一些時間才弄清楚FixedLocator使用相同的信息但保持刻度位置完整)。您可以使用 x/y 來查看每個解決方案如何影響輸出。
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.ticker as mticker
mpl.rcParams['font.size'] = 6.5
x = np.array(range(1000, 5000, 500))
y = 37*x
fig, [ax1, ax2, ax3] = plt.subplots(1,3)
ax1.plot(x,y, linewidth=5, color='green')
ax2.plot(x,y, linewidth=5, color='red')
ax3.plot(x,y, linewidth=5, color='blue')
label_format = '{:,.0f}'
# nothing done to ax1 as it is a "control chart."
# fixing yticks with "set_yticks"
ticks_loc = ax2.get_yticks().tolist()
ax2.set_yticks(ax1.get_yticks().tolist())
ax2.set_yticklabels([label_format.format(x) for x in ticks_loc])
# fixing yticks with matplotlib.ticker "FixedLocator"
ticks_loc = ax3.get_yticks().tolist()
ax3.yaxis.set_major_locator(mticker.FixedLocator(ticks_loc))
ax3.set_yticklabels([label_format.format(x) for x in ticks_loc])
# fixing xticks with FixedLocator but also using MaxNLocator to avoid cramped x-labels
ax3.xaxis.set_major_locator(mticker.MaxNLocator(3))
ticks_loc = ax3.get_xticks().tolist()
ax3.xaxis.set_major_locator(mticker.FixedLocator(ticks_loc))
ax3.set_xticklabels([label_format.format(x) for x in ticks_loc])
fig.tight_layout()
plt.show()
輸出圖表:
顯然,像上面這樣的幾行閑置代碼(我基本上是獲取 yticks 或 xticks 并再次設置它們)只會給我的程序增加噪音。我希望刪除該警告。但是,請查看一些“錯誤報告”(來自上面/下面評論中的鏈接;問題實際上不是錯誤:它是產生一些問題的更新),并且管理 matplotlib 的貢獻者有他們的理由保留警告。
舊版本的 MATPLOTLIB:?如果您使用控制臺來控制代碼的關鍵輸出(就像我一樣),則警告消息可能會出現問題。因此,延遲處理該問題的一種方法是將 matplotlib 降級到版本 3.2.2。我使用 Anaconda 來管理我的 Python 包,以下是用于降級 matplotlib 的命令:
conda?install?matplotlib=3.2.2
并非所有列出的版本都可用。

TA貢獻1744條經驗 獲得超4個贊
如果有人使用該函數(或 yaxis 等效函數)來到這里axes.xaxis.set_ticklabels()
,您不需要使用 FixLocator,您可以使用axes.xaxis.set_ticks(values_list)
BEFORE axes.xaxis.set_ticklabels(labels_list)
來避免此警告。

TA貢獻1812條經驗 獲得超5個贊
當我嘗試使用定位的日期刻度旋轉 X 軸上的刻度標簽時,我遇到了同樣的問題:
ax.set_xticklabels(ax.get_xticklabels(), rotation=45) ax.xaxis.set_major_locator(dates.DayLocator())
它使用“tick_params()”方法計算出來:
ax.tick_params(axis='x', labelrotation = 45)

TA貢獻1864條經驗 獲得超2個贊
根據這個 matplotlib頁面
# FixedFormatter should only be used together with FixedLocator.
# Otherwise, one cannot be sure where the labels will end up.
這意味著一個人應該做
positions = [0, 1, 2, 3, 4, 5]
labels = ['A', 'B', 'C', 'D', 'E', 'F']
ax.xaxis.set_major_locator(ticker.FixedLocator(positions))
ax.xaxis.set_major_formatter(ticker.FixedFormatter(labels))
ticker.LogLocator但即使標簽被傳遞到 ,問題仍然存在ticker.FixedFormatter。所以這種情況下的解決方案是
定義格式化函數
# FuncFormatter can be used as a decorator
@ticker.FuncFormatter
def major_formatter(x, pos):
return f'{x:.2f}'
并將格式化程序函數傳遞給FixedFormatter
ax.xaxis.set_major_locator(ticker.LogLocator(base=10, numticks=5))
ax.xaxis.set_major_formatter(major_formatter)
詳情請參閱上面的鏈接。
添加回答
舉報