построение графиков нескольких типов графиков (линия, разброс, полоса и т. д.) в одном окне - PullRequest
4 голосов
/ 08 сентября 2011

Я пытаюсь построить график двух типов графиков в одном и том же окне (то есть линейный график и график рассеяния). Данные, представленные на линейном графике (первый график), представляют собой плавающие числовые значения, представляющие индексы климата (Y) и десятичные годы (X). Второй график, на котором я хотел бы быть «разбросанным», почти такой же, но с плавающими числовыми значениями, представляющими потоки потоков (Y) и десятичные годы (X). Я попытался сделать это следующим образом, используя двойную ось x и вторую ось паразита y для диаграммы рассеяния:

    import mpl_toolkits
    from mpl_toolkits.axes_grid1 import host_subplot
    import matplotlib.pyplot as plt

    host = host_subplot(111)
    par = host.twinx()

    host.set_xlim(1880, 2020)
    host.set_ylim(-5, 10)

    host.set_xlabel("Time")
    host.set_ylabel("PDSI Region 01")
    par.set_ylabel("Minimum 10% Annual 7-day Non-exceedance Flow (cfs)")

    x1 = timearray
    y1 = pdsiarray01
    x2 = upAmm_yr
    y2 = upAmm_min

    p1, = host.plot(x1, y1, label="PDSI01")
    p2, = par.scatter(x2, y2, label="Annual Lowflow Upper Amm")

    par.set_ylim(30, 60)

    host.legend()
    host.axis["left"].label.set_color(p1.get_color())
    par.axis["right"].label.set_color(p2.get_color())

    plt.draw()
    plt.show()

и я получаю код ошибки:

    TypeError: cannot perform reduce with flexible type

Этот код работает нормально, когда я заменяю scatter на plot в строке, начинающейся с p2, но выдает вторую линию plot. Основная причина, по которой я хочу, чтобы это было разбросано, заключается в том, что во втором наборе данных должно быть отображено гораздо меньше точек, а линии, соединяющие их, отвлекают и «запутывают» (когда все, что мне нужно, это выделить момент во времени). Гистограмма вместо разброса тоже подойдет. Любые предложения или помощь будет принята с благодарностью!

Ответы [ 2 ]

4 голосов
/ 09 сентября 2011

Почему бы просто не использовать plot в обоих случаях?

import datetime
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

# Generate some random data
time = mdates.drange(datetime.datetime(2010, 1, 1), 
                     datetime.datetime(2011, 1, 1),
                     datetime.timedelta(days=5))
y1 = np.cumsum(np.random.random(time.size) - 0.5)
y2 = np.cumsum(np.random.random(time.size) - 0.5)
y2 = y2 * 20 + 10

# Plot things up...
fig = plt.figure()
host = fig.add_subplot(111)
par = host.twinx()

host.set_ylabel('One Thing')
par.set_ylabel('Another')

line1, = host.plot(time, y1)
line2, = par.plot(time, y2, 'go')
host.legend([line1, line2], ['Item 1', 'Item 2'])

host.xaxis_date()

plt.show()

enter image description here

1 голос
/ 08 сентября 2011

f Я не могу воспроизвести вашу точную ошибку, но я не думаю, что вам нужна запятая после p2, поскольку scatter возвращает только одно значение. Когда это меняется, ваш код работает для меня, за исключением того, что p2 - это CircleCollection, у которого нет get_color метода. Вам нужно изменить это на p2.get_facecolor() или что-то еще.

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