matplotlib 用对数刻度设置刻度

jhdbpxl9  于 2023-03-30  发布在  其他
关注(0)|答案(5)|浏览(157)

似乎set_xticks在对数尺度下不工作:

from matplotlib import pyplot as plt
fig1, ax1 = plt.subplots()
ax1.plot([10, 100, 1000], [1,2,3])
ax1.set_xscale('log')
ax1.set_xticks([20, 200, 500])
plt.show()

这可能吗?

1bqhqjot

1bqhqjot1#

import matplotlib
from matplotlib import pyplot as plt
fig1, ax1 = plt.subplots()
ax1.plot([10, 100, 1000], [1,2,3])
ax1.set_xscale('log')
ax1.set_xticks([20, 200, 500])
ax1.get_xaxis().set_major_formatter(matplotlib.ticker.ScalarFormatter())

ax1.get_xaxis().get_major_formatter().labelOnlyBase = False
plt.show()

5us2dqdw

5us2dqdw2#

我将添加几个图,并展示如何删除次要刻度:
OP:

from matplotlib import pyplot as plt

fig1, ax1 = plt.subplots()
ax1.plot([10, 100, 1000], [1,2,3])
ax1.set_xscale('log')
ax1.set_xticks([20, 300, 500])
plt.show()

tcaswell所指出的,要添加一些特定的tick,可以使用matplotlib.ticker.ScalarFormatter

from matplotlib import pyplot as plt
import matplotlib.ticker

fig1, ax1 = plt.subplots()
ax1.plot([10, 100, 1000], [1,2,3])
ax1.set_xscale('log')
ax1.set_xticks([20, 300, 500])
ax1.get_xaxis().set_major_formatter(matplotlib.ticker.ScalarFormatter())
plt.show()

要删除次要刻度,可以使用matplotlib.rcParams['xtick.minor.size']

from matplotlib import pyplot as plt
import matplotlib.ticker

matplotlib.rcParams['xtick.minor.size'] = 0
matplotlib.rcParams['xtick.minor.width'] = 0

fig1, ax1 = plt.subplots()
ax1.plot([10, 100, 1000], [1,2,3])
ax1.set_xscale('log')
ax1.set_xticks([20, 300, 500])
ax1.get_xaxis().set_major_formatter(matplotlib.ticker.ScalarFormatter())

plt.show()

你可以使用ax1.get_xaxis().set_tick_params,它有同样的效果(但只修改当前轴,而不是所有未来的数字,不像matplotlib.rcParams):

from matplotlib import pyplot as plt
import matplotlib.ticker

fig1, ax1 = plt.subplots()
ax1.plot([10, 100, 1000], [1,2,3])
ax1.set_xscale('log')
ax1.set_xticks([20, 300, 500])
ax1.get_xaxis().set_major_formatter(matplotlib.ticker.ScalarFormatter())

ax1.get_xaxis().set_tick_params(which='minor', size=0)
ax1.get_xaxis().set_tick_params(which='minor', width=0) 

plt.show()

ar5n3qh5

ar5n3qh53#

from matplotlib.ticker import ScalarFormatter, NullFormatter
for axis in [ax.xaxis]:
    axis.set_major_formatter(ScalarFormatter())
    axis.set_minor_formatter(NullFormatter())

这将删除指数符号

t5fffqht

t5fffqht4#

最好使用np.geomspace作为xticks

ax = sns.histplot(arr, log_scale=True)
ax.xaxis.set_major_formatter(matplotlib.ticker.ScalarFormatter())
ax.set_xticks( np.geomspace(1, 1500 ,15).round() )

9q78igpj

9q78igpj5#

要使用x刻度对数绘制半对数图,有两个选项:

import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot(x,y)
ax.set_xscale('log')

import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.semilogx(x,y)

如果不需要设置xtick,这两个都可以。
如果你需要**来设置xtick,第二个会更好。
同样地

ax.loglog(x,y)

优于

ax.plot(x,y)
ax.set_xscale('log')
ax.set_yscale('log')

必须设置刻度时;

ax.semilogy(x,y)

优于

ax.plot(x,y)
ax.set_yscale('log')

当需要设置刻度时。

相关问题