Python - Matplotlib разного цвета для разных значений y - PullRequest
0 голосов
/ 16 октября 2019

Я пытался построить некоторые данные с помощью matplotlib. Я использую:

plt.plot(x1Values, y1Values, color='green', linestyle='None', 
        marker='o', markerfacecolor='blue', markersize=4)

Здесь x1Values ​​- это список имен, например:

x1Values = ['alice', 'jordan', 'mike']

, а y1Values ​​- это список двоичных кортежей, например:

y1Values = [(2,3),(1,1),(4,5)]

Теперь упомянутая выше функция графика работает в основном как ожидаемые две точки против каждого значения на оси x, но график немного загроможден, так как мои фактические размеры списка составляют ~ 100. Вот почему я хочу избежать функции plt.label () для обозначения этих точек. Метки начинают перекрываться, что делает графики беспорядочными и несколько бесполезными. То, что я хочу сделать, это дать разные цвета этим точкам. Например, на графике я хочу, чтобы (alice, 2) было зеленым, а (alice, 3) красным. аналогично, (mike, 4) будет зеленым, и (mike, 5) красным, и, если возможно, (у меня нет больших надежд здесь, но если возможно), я бы хотел, чтобы точка пересечения (jordan, 1) и (Джордан, 1) чтобы был какой-то другой цвет, скажем синий. Но хорошо, если это не достижимо, пока остальное достигается

Ответы [ 2 ]

1 голос
/ 16 октября 2019

Я видел ваш ответ слишком поздно, поэтому вот мой подход:

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

from matplotlib import pyplot as plt

x1Values = ['alice', 'jordan', 'mike']
y1Values = [(2,3),(1,1),(4,5)]

xData = []
yData = []
cols = []
for counter, name in enumerate(x1Values):
    #Decide which point gets which color
    if (y1Values[counter][0] > y1Values[counter][1]):
        cols += ['r', 'g']
    elif (y1Values[counter][0] < y1Values[counter][1]):
        cols += ['g', 'r']
    else:
        cols += ['b', 'b']

    #adding names and values to the data for x and y Axes    
    xData += [name, name]
    yData += y1Values[counter]


myplot = plt.scatter(xData, yData, color=cols)

plt.show()
0 голосов
/ 16 октября 2019

Разобрался с решением, через минуты после публикации вопроса. Разделите значения y на два списка и нанесите их оба по отдельности, вот код:

y1Values = [i[0] for i in yValues]
y2Values = [i[1] for i in yValues]
plt.plot(x1Values, y1Values, color='black', linestyle='None', linewidth = 3, 
        marker='o', markerfacecolor='green', markersize=4)
plt.plot(x1Values, y2Values, color='black', linestyle='None', linewidth = 3, 
        marker='o', markerfacecolor='red', markersize=4)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...