К сожалению, особенность различных стилей линий для отрицательных значений не предоставляется пользователю.Это связано с тем, используется ли один цвет для линий.Это переключает свойство monochrome
, которое, в свою очередь, решает, следует ли изменить стиль линии.
Быстрый взлом заключается в том, чтобы установить для атрибута monochrome
значение True и сбросить стили линий.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 5, 50)
y = np.linspace(0, 5, 40)
X, Y = np.meshgrid(x, y)
def f(x, y):
return np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)
Z = f(X, Y)
cntr = plt.contour(X, Y, Z, cmap='RdBu')
cntr.monochrome = True
for col, ls in zip(cntr.collections, cntr._process_linestyles()):
col.set_linestyle(ls)
plt.show()
![enter image description here](https://i.stack.imgur.com/7LS2K.png)
Сздесь используется закрытый атрибут ._process_linestyles()
, поэтому не рекомендуется использовать его в рабочем коде;но вместо этого используйте @ WarrenWeckesser's answer или указанную ниже опцию.
Здесь я хотел бы указать на опцию установки linestyles
априори, в зависимости от уровней:
import matplotlib.pyplot as plt
import matplotlib.ticker
import numpy as np
x = np.linspace(0, 5, 50)
y = np.linspace(0, 5, 40)
X, Y = np.meshgrid(x, y)
def f(x, y):
return np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)
Z = f(X, Y)
loc = matplotlib.ticker.MaxNLocator(7)
lvls = loc.tick_values(Z.min(), Z.max())
cntr = plt.contour(X, Y, Z, levels=lvls, cmap='RdBu',
linestyles=np.where(lvls >= 0, "-", "--"))
plt.show()