使用logscale在contourf中的更多区域

时间:2017-06-24 17:30:15

标签: python-3.x matplotlib

我目前正试图让我的轮廓图得到持续改变的印象。我必须使用logscale作为值,因为其中一些比其他值大几个数量级。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import ticker

K = np.linspace(-0.99, 5, 100)
x = np.linspace(1, 5, 100)
K, x = np.meshgrid(K, x)
static_diff = 1 / (1 + K)
fig = plt.figure()
plot = plt.contourf(K, x, static_diff, locator=ticker.LogLocator(numticks=300))
plt.grid(True)
plt.xlabel('K')
plt.ylabel('x')
plt.xlim([-0.99, 5])
plt.ylim([1, 5])
fig.colorbar(plot)
plt.show()

尽管给出的刻度数为300,但它返回的图如:enter image description here

有没有办法获得更多这些线?我还尝试添加参数数量作为plt.contourf函数的第四个参数。

1 个答案:

答案 0 :(得分:1)

要指定等高线图的等级,您可以

  • 使用levels参数并提供级别的值列表。例如,20级,

    plot = plt.contourf(K, x, static_diff, levels=np.logspace(-2, 3, 20))
    
  • 使用您将提供matplotlib自动收录器的locator参数

    plt.contourf(K, x, static_diff, locator=ticker.LogLocator(subs=range(1,10)))
    

    但请注意,LogLocator不使用numticks参数,而是使用basesubs参数来确定刻度的位置。 See documentation

后一种情况的完整示例,它还使用LogNorm在日志空间中更好地分配颜色:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import ticker
import matplotlib.colors

K = np.linspace(-0.99, 5, 100)
x = np.linspace(1, 5, 100)
K, x = np.meshgrid(K, x)
static_diff = 1 / (1 + K)
fig = plt.figure()
norm= matplotlib.colors.LogNorm(vmin=static_diff.min(), vmax=static_diff.max())
plot = plt.contourf(K, x, static_diff, locator=ticker.LogLocator(subs=range(1,10)), norm=norm)
#plot = plt.contourf(K, x, static_diff, levels=np.logspace(-2, 3, 20), norm=norm)
plt.grid(True)
plt.xlabel('K')
plt.ylabel('x')
plt.xlim([-0.99, 5])
plt.ylim([1, 5])
fig.colorbar(plot)
plt.show()

enter image description here