我正在尝试生成一个图并使用日志来显示相对比较,该图显示正确,但是,保存的图形没有任何图,只有轴。
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')
,如果我删除它,该图将在保存的图中正确显示,但当我使用它时为空。
如有任何帮助,我们将不胜感激。
我相信您已经发现了一个
matplotlib
错误。
该错误可能局限于
savefig
方法。这是我尝试过的:
代码按原样 按原样运行您的代码,我得到的正是您所描述的行为。下图是
show
n...
但是,正如您所报告的,保存的 PDF 在轴内没有显示条形:
另存为 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 和“显示的”图像完美匹配:
如果我只更改其中一个数字,通过向其添加 1,我仍然会得到匹配且有效的图像:
如果我将 0.01 加到其中一个数字上,情况也是如此,但如果我将加法减少到仅 0.001,结果就会变得很奇怪。
使用
decimal.Decimal()
我尝试将所有
y_values
转换为 Decimal
,这没有什么区别。
结论
这种非常不一致的行为让我认为这是某种
matplotlib
的错误。
事实上,只有当值之间的差异缩小到大约 0.001 时,问题才会出现,这让我认为这可能与舍入有关,但我不能确定......
我的设置
我在 Windows 10 上使用 Python 3.11、matplotlib v3.9.0 在 VSCode 中运行您的代码。