matplotlib 散点图跳过对数刻度的主要刻度,即使手动间隔[重复]

4xy9mtcn  于 2023-05-23  发布在  其他
关注(0)|答案(1)|浏览(155)

此问题已在此处有答案

Matplotlib semi-log plot: minor tick marks are gone when range is large(5个答案)
How can I set the aspect ratio in matplotlib?(7个回答)
3天前关闭。
我用matplotlib在双对数散点图上画点。这些点的x坐标的上升速度是y坐标的两倍(指数意义上),这意味着当绘制在正方形图上时,x轴的密度是y轴的两倍。
下面是它生成的代码和图形:

import matplotlib.pyplot as plt
import matplotlib.ticker as tkr

fig, ax = plt.subplots(figsize=(10,8))
ax: plt.Axes

# Log scale
ax.set_xscale("log")  # Needed for a log scatterplot. https://stackoverflow.com/a/52573929/9352077
ax.set_yscale("log")
# ax.xaxis.set_major_locator(tkr.LogLocator(base=10))
# ax.xaxis.set_major_formatter(tkr.LogFormatterSciNotation())
# ax.yaxis.set_major_locator(tkr.LogLocator(base=10))
# ax.yaxis.set_major_formatter(tkr.LogFormatterSciNotation())

# Plot points
t = range(1, 10_000_000, 1000)
x = [e**2 for e in t]
y = t
ax.scatter(x, y, marker=".", linewidths=0.05)

# Grid
ax.set_axisbelow(True)
ax.grid(True)

fig.savefig("./test.pdf", bbox_inches='tight')

默认情况下,matplotlib似乎想要一个正方形网格,因此在x轴上每隔一个10的幂就跳过一次。据推测,我注解掉的4行--定位器和格式化程序的组合--是定制主要刻度间距的方法。例如,参见this post。**然而,取消注解它们会产生相同的确切数字,缺少主要刻度。
如果不使用LogLocator(base=10),我还能如何更改对数刻度上刻度之间的间距?下面是它的大致外观(我用红色突出显示了更改,但它们当然应该是灰色的):

bxjv4tth

bxjv4tth1#

这就是您想要的输出结果吗?您可能需要一个更健壮的x_ticks解决方案。我去掉了t值因为你不需要它

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(10, 8))
ax: plt.Axes

# Log scale
ax.set_xscale("log")  
ax.set_yscale("log")

# Plot points
y = range(1, 10_000_000, 1000)
x = [e**2 for e in y]

ax.scatter(x, y, marker=".")

# Grid
ax.set_axisbelow(True)
ax.grid(True)
ax.set_xscale("log")
ax.set_xticks([10**x for x in range(0, 14)])


fig.savefig("./test.pdf", bbox_inches='tight')

相关问题