在保存的图中使用日志时,Matplotlib 不生成绘图

问题描述 投票:0回答:1

我正在尝试生成一个图并使用日志来显示相对比较,该图显示正确,但是,保存的图形没有任何图,只有轴。

import matplotlib.pyplot as plt

# Data
y_values = [4.385236951214598, 4.385249349505862, 4.38524255048674, 4.385237751115038, 4.385241350648787]
x_labels = ["Dota", "Youtube", "Exchange", "Fifa", "Uber"]

# Create the plot
fig, ax = plt.subplots(figsize=(10, 6))
ax.bar(x_labels, y_values, color=plt.cm.viridis(range(len(x_labels))))

# Set y-axis to log scale
ax.set_yscale('log')

# Add title and labels
ax.set_title("Contracts vs. Values (Log Scale)")
ax.set_xlabel("Contracts")
ax.set_ylabel("Values")

# Save the plot as a PDF file
fig.savefig('gas-burnt-per-contract.pdf', dpi=300, bbox_inches='tight', transparent=True, pad_inches=0)

# Display the plot
plt.show()

罪魁祸首是

ax.set_yscale('log')
,如果我删除它,该图将在保存的图中正确显示,但当我使用它时为空。

如有任何帮助,我们将不胜感激。

python matplotlib plot
1个回答
0
投票

我相信您已经发现了一个

matplotlib
错误。

该错误可能局限于

savefig
方法。这是我尝试过的:

代码按原样 按原样运行您的代码,我得到的正是您所描述的行为。下图是

show
n...

SHOWn image when running OP's code as-is

但是,正如您所报告的,保存的 PDF 在轴内没有显示条形:

Saved image

另存为 PNG 或 SVG

仅将保存格式从 PDF 更改为 PNG 或 SVG 会在“显示”图像和“保存”图像中产生相同的结果。

使用

plt.yscale()
代替
ax.set_yscale()

使用

plt.yscale()
(按照这个答案的建议,而不是像您所做的那样使用
ax.set_yscale()
,没有什么区别。

更改输入值

如果我将 y_values 更改为:

y_values = [
    4.385236951214598,
    4.385249349505862,
    4.38524255048674,
    4.385237751115038,
    4.385241350648787,

到...

y_values = [
    4.385236951214598,
    5.385249349505862,
    6.38524255048674,
    7.385237751115038,
    8.385241350648787,

PDF 和“显示的”图像完美匹配:

Changing numbers to differ more

如果我只更改其中一个数字,通过向其添加 1,我仍然会得到匹配且有效的图像:

With just one value changed

如果我将 0.01 加到其中一个数字上,情况也是如此,但如果我将加法减少到仅 0.001,结果就会变得很奇怪。

使用

decimal.Decimal()

我尝试将所有

y_values
转换为
Decimal
,这没有什么区别。

结论

这种非常不一致的行为让我认为这是某种

matplotlib
的错误。

事实上,只有当值之间的差异缩小到大约 0.001 时,问题才会出现,这让我认为这可能与舍入有关,但我不能确定......

我的设置

我在 Windows 10 上使用 Python 3.11、matplotlib v3.9.0 在 VSCode 中运行您的代码。

© www.soinside.com 2019 - 2024. All rights reserved.