Ошибка Pyplot не может быть передан массив цветов - PullRequest
1 голос
/ 09 ноября 2019

Я пытаюсь изменить внешний вид диаграммы, созданной с помощью plt.errorbar, но не могу изменить ее так, как мне бы хотелось.

Чтобы продемонстрировать проблему, я составилнекоторые примеры данных:

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import matplotlib.axes as axes
import numpy as np
Temps=np.array([18000,15000,14000,12000,11750,11500,10000,5750,6000])
Powers=np.array([1.2,1.0,0.5,.35,0.4,0.2,.15,5.3,4.9])
Errors=100*np.array([2,2,2,2,2,2,2,3,3])

У меня есть функция, которая преобразует значения температуры в цвета:

def makecolour(t):
    a=(t-min(Temps))/(max(Temps)-min(Temps))
    return [[1-A,0,A] for A in a]

Я также изменил некоторые другие свойства диаграммы.

plt.axes(facecolor='black')
plt.yscale('log')
plt.xscale('log')
plt.xlim(2e4,5e3)

plt.errorbar(Temps,Powers,xerr=Errors,ecolor=makecolour(Temps),fmt='.')

Я не могу заставить точки данных изменить цвет, только полосы ошибок. Когда я пытаюсь изменить цвет фактических точек:

plt.errorbar(Temps,Powers,xerr=Errors,ecolor=makecolour(Temps),fmt='.',color=makecolour(Temps))
"Breaks because it fails to interpret the array of colours."

Это не работает, и я не знаю, как это исправить. Самое близкое решение, которое я нашел, - полностью скрыть точки данных:

plt.errorbar(Temps,Powers,xerr=Errors,ecolor=makecolour(Temps),fmt='.',markersize=0)
"Not showing where the data point is isn't acceptable."`

Но это недостаточно хорошо.

Я также боролся с тем, как отображаются тики осей, когдаиспользуя plt.xscale('log'). В идеале я хочу отображать метки в виде простого целого числа, а не научного обозначения, но ни одно из решений, которые я пробовал, не сработало. Я попытался:

ticker.LogFormatter(base=1)
axes.ticklabel_format(style='plain')

Я искал здесь ответы на предыдущие вопросы, но я не нашел никаких рассуждений о подобных проблемах с plt.errorbar. Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 09 ноября 2019

Вот частичный ответ. Просто первый график без маркеров и на том же графике без линий ошибок.

О тикерах, этот пост предлагает:

ax=plt.gca()
ax.xaxis.set_minor_formatter(ticker.ScalarFormatter())
ax.xaxis.set_major_formatter(ticker.ScalarFormatter())

Демонстрационный код:

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

Temps=np.array([18000,15000,14000,12000,11750,11500,10000,5750,6000])
Powers=np.array([1.2,1.0,0.5,.35,0.4,0.2,.15,5.3,4.9])
Errors=100*np.array([2,2,2,2,2,2,2,3,3])

def makecolour(t):
    a=(t-min(Temps))/(max(Temps)-min(Temps))
    return [[1-A,0,A] for A in a]

plt.axes(facecolor='black')
plt.yscale('log')
plt.xscale('log')
plt.xlim(2e4,5e3)

ax=plt.gca()
ax.xaxis.set_minor_formatter(ticker.ScalarFormatter())
ax.xaxis.set_major_formatter(ticker.ScalarFormatter())

plt.errorbar(Temps,Powers,xerr=Errors,ecolor=makecolour(Temps),fmt='.',markersize=0)
plt.errorbar(Temps,Powers,xerr=None,fmt='.')

plt.show()

resulting plot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...