具有极值的 matplotlib contourf
matplotlib contourf with extreme values
我有要用极端边缘值绘制的数据,下面给出了一个通用示例:
import matplotlib.pyplot as plt
plt.style.use('seaborn-white')
import numpy as np
Z = np.random.rand(100,100)
plt.contourf(Z, 100, cmap='RdGy', vmin=0, vmax=1)
plt.colorbar()
plt.show()
使用上面的代码我得到了这个图:
但是如果我只更改 Z 的一行以包含极值它 "dominates" 整个图:
import matplotlib.pyplot as plt
plt.style.use('seaborn-white')
import numpy as np
Z = np.random.rand(100,100)
Z[:1] *= 100
plt.contourf(Z, 100, cmap='RdGy', vmin=0, vmax=1)
plt.colorbar()
plt.show()
我的问题是这样的:在第二个例子中,虽然我有极值,但所有有趣的事情显然都发生在0和1的范围内,这完全由我在第1行输入的乘法决定,即使尽管我相应地设置了 vmin 和 vmax。如何保持数据原样,而 "focusing" 在 0-1 范围内?我真的不在乎第一行发生了什么,因为我只关心值 1-100 可以有一种颜色。
非常感谢。
这似乎是一种已知行为,如 GH issue 中所述。
解决方法(在问题评论中给出)是对 levels
参数使用可迭代而不是依赖 vmin
和 vmax
.
这是一个代码片段,展示了如何将 vmin
和 vmax
与 pcolormesh
一起使用(如您在评论中所说)以及如何使用 contourf
.
import matplotlib.pyplot as plt
plt.style.use('seaborn-white')
import numpy as np
def main():
fig, axs = plt.subplots(2)
Z = np.random.rand(100,100)
Z[:1] *= 100
cmap = plt.get_cmap("viridis")
p1 = axs[0].pcolormesh(Z, vmin=0., vmax=1, cmap=cmap)
fig.colorbar(p1, ax=axs[0])
p2 = axs[1].contourf(Z, levels=np.linspace(0, 1, 100), cmap=cmap)
fig.colorbar(p2, ax=axs[1], ticks=np.linspace(0, 1, 5))
plt.show()
if __name__ == '__main__':
main()
我有要用极端边缘值绘制的数据,下面给出了一个通用示例:
import matplotlib.pyplot as plt
plt.style.use('seaborn-white')
import numpy as np
Z = np.random.rand(100,100)
plt.contourf(Z, 100, cmap='RdGy', vmin=0, vmax=1)
plt.colorbar()
plt.show()
使用上面的代码我得到了这个图:
但是如果我只更改 Z 的一行以包含极值它 "dominates" 整个图:
import matplotlib.pyplot as plt
plt.style.use('seaborn-white')
import numpy as np
Z = np.random.rand(100,100)
Z[:1] *= 100
plt.contourf(Z, 100, cmap='RdGy', vmin=0, vmax=1)
plt.colorbar()
plt.show()
我的问题是这样的:在第二个例子中,虽然我有极值,但所有有趣的事情显然都发生在0和1的范围内,这完全由我在第1行输入的乘法决定,即使尽管我相应地设置了 vmin 和 vmax。如何保持数据原样,而 "focusing" 在 0-1 范围内?我真的不在乎第一行发生了什么,因为我只关心值 1-100 可以有一种颜色。
非常感谢。
这似乎是一种已知行为,如 GH issue 中所述。
解决方法(在问题评论中给出)是对 levels
参数使用可迭代而不是依赖 vmin
和 vmax
.
这是一个代码片段,展示了如何将 vmin
和 vmax
与 pcolormesh
一起使用(如您在评论中所说)以及如何使用 contourf
.
import matplotlib.pyplot as plt
plt.style.use('seaborn-white')
import numpy as np
def main():
fig, axs = plt.subplots(2)
Z = np.random.rand(100,100)
Z[:1] *= 100
cmap = plt.get_cmap("viridis")
p1 = axs[0].pcolormesh(Z, vmin=0., vmax=1, cmap=cmap)
fig.colorbar(p1, ax=axs[0])
p2 = axs[1].contourf(Z, levels=np.linspace(0, 1, 100), cmap=cmap)
fig.colorbar(p2, ax=axs[1], ticks=np.linspace(0, 1, 5))
plt.show()
if __name__ == '__main__':
main()