Цветная панель с plt.Circle (add_artist) [дубликат]

Примером этого исключаемого исключения является: Когда вы пытаетесь проверить что-то, это null.

Например:

string testString = null; //Because it doesn't have a value (i.e. it's null; "Length" cannot do what it needs to do)

if (testString.Length == 0) // Throws a nullreferenceexception
{
    //Do something
} 

Время выполнения .NET исключение NullReferenceException при попытке выполнить действие над чем-то, что не было инстанцировано, т.е. код выше.

По сравнению с ArgumentNullException, которое обычно выбрано как защитная мера, если метод ожидает, что то, что происходит

Дополнительная информация находится в C # NullReferenceException и Null Parameter .

52
задан Rafael S. Calsaverini 1 December 2011 в 21:57
поделиться

4 ответа

Вот один из способов сделать это, все еще используя plt.plot (). В принципе, вы делаете отбрасывающий сюжет и получаете цветную панель оттуда.

import matplotlib as mpl
import matplotlib.pyplot as plt

min, max = (-40, 30)
step = 10

# Setting up a colormap that's a simple transtion
mymap = mpl.colors.LinearSegmentedColormap.from_list('mycolors',['blue','red'])

# Using contourf to provide my colorbar info, then clearing the figure
Z = [[0,0],[0,0]]
levels = range(min,max+step,step)
CS3 = plt.contourf(Z, levels, cmap=mymap)
plt.clf()

# Plotting what I actually want
X=[[1,2],[1,2],[1,2],[1,2]]
Y=[[1,2],[1,3],[1,4],[1,5]]
Z=[-40,-20,0,30]
for x,y,z in zip(X,Y,Z):
    # setting rgb color based on z normalized to my range
    r = (float(z)-min)/(max-min)
    g = 0
    b = 1-r
    plt.plot(x,y,color=(r,g,b))
plt.colorbar(CS3) # using the colorbar info I got from contourf
plt.show()

Это немного расточительно, но удобно. Это также не очень расточительно, если вы делаете несколько графиков, так как вы можете вызвать plt.colorbar () без регенерации информации для него.

enter image description here [/g0]

30
ответ дан Hooked 24 August 2018 в 02:11
поделиться

Как и другие ответы здесь, попробуйте использовать фиктивные графики, что на самом деле не является хорошим стилем, вот общий код для

Дискретная цветная панель

Дискретная панель цвета создается в таким же образом создается непрерывная панель цвета, только с другой нормализацией. В этом случае необходимо использовать BoundaryNorm.

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

n_lines = 5
x = np.linspace(0, 10, 100)
y = np.sin(x[:, None] + np.pi * np.linspace(0, 1, n_lines))
c = np.arange(1., n_lines + 1)

cmap = plt.get_cmap("jet", len(c))
norm = matplotlib.colors.BoundaryNorm(np.arange(len(c)+1)+0.5,len(c))
sm = plt.cm.ScalarMappable(norm=norm, cmap=cmap)
sm.set_array([])

fig, ax = plt.subplots(dpi=100)
for i, yi in enumerate(y.T):
    ax.plot(x, yi, c=cmap(i))
fig.colorbar(sm, ticks=c)
plt.show()

2
ответ дан ImportanceOfBeingErnest 24 August 2018 в 02:11
поделиться

(Я знаю, что это старый вопрос, но ...) Для цветных символов требуется matplotlib.cm.ScalarMappable, plt.plot создает строки, которые не являются скалярными, поэтому, чтобы сделать цветную панель, нам нужно будет сделать скалярное отображение.

Хорошо. Таким образом, конструктор ScalarMappable принимает экземпляр cmap и norm. (данные шкалы нормали до диапазона 0-1, cmaps, с которыми вы уже работали, и принимаете число между 0-1 и возвращает цвет). Итак, в вашем случае:

import matplotlib.pyplot as plt
sm = plt.cm.ScalarMappable(cmap=my_cmap, norm=plt.normalize(min=0, max=1))
plt.colorbar(sm)

Поскольку ваши данные уже находятся в диапазоне 0-1, вы можете упростить создание sm, чтобы:

sm = plt.cm.ScalarMappable(cmap=my_cmap)

Надеяться, что помогает кто-то.

EDIT: для matplotlib v1.2 или выше код становится:

import matplotlib.pyplot as plt
sm = plt.cm.ScalarMappable(cmap=my_cmap, norm=plt.normalize(vmin=0, vmax=1))
# fake up the array of the scalar mappable. Urgh...
sm._A = []
plt.colorbar(sm)

EDIT: для matplotlib v1.3 или выше код становится:

import matplotlib.pyplot as plt
sm = plt.cm.ScalarMappable(cmap=my_cmap, norm=plt.Normalize(vmin=0, vmax=1))
# fake up the array of the scalar mappable. Urgh...
sm._A = []
plt.colorbar(sm)
96
ответ дан j08lue 24 August 2018 в 02:11
поделиться

Вот немного упрощенный пример, вдохновленный верхним ответом, данным Boris и Hooked (Спасибо за отличную идею!):

1 , Дискретная colorbar

Дискретная панель цвета более активна, поскольку цветовая палитра, сгенерированная mpl.cm.get_cmap(), не является отображаемым изображением, необходимым в качестве аргумента colorbar(). Нужно создать сэмплирование, как показано ниже:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

n_lines = 5
x = np.linspace(0, 10, 100)
y = np.sin(x[:, None] + np.pi * np.linspace(0, 1, n_lines))
c = np.arange(1, n_lines + 1)

cmap = mpl.cm.get_cmap('jet', n_lines)

fig, ax = plt.subplots(dpi=100)
# Make dummie mappable
dummie_cax = ax.scatter(c, c, c=c, cmap=cmap)
# Clear axis
ax.cla()
for i, yi in enumerate(y.T):
    ax.plot(x, yi, c=cmap(i))
fig.colorbar(dummie_cax, ticks=c)
plt.show();

Это приведет к созданию графика с дискретным цветом:


2. Непрерывная цветная панель

Непрерывная цветовая панель менее задействована, так как mpl.cm.ScalarMappable() позволяет нам получить «изображение» для colorbar().

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl


n_lines = 5
x = np.linspace(0, 10, 100)
y = np.sin(x[:, None] + np.pi * np.linspace(0, 1, n_lines))
c = np.arange(1, n_lines + 1)

norm = mpl.colors.Normalize(vmin=c.min(), vmax=c.max())
cmap = mpl.cm.ScalarMappable(norm=norm, cmap=mpl.cm.jet)
cmap.set_array([])

fig, ax = plt.subplots(dpi=100)
for i, yi in enumerate(y.T):
    ax.plot(x, yi, c=cmap.to_rgba(i + 1))
fig.colorbar(cmap, ticks=c)
plt.show();

Это приведет к созданию графика с непрерывной цветной панелью:

[Сторона примечания] В этом примере я лично не знаю, почему cmap.set_array([]) (в противном случае мы получим сообщения об ошибках). Если кто-то понимает принципы под капотом, прокомментируйте:)

3
ответ дан Shan Dou 24 August 2018 в 02:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: