Как изменить значения сюжета в Python - PullRequest
0 голосов
/ 24 февраля 2019

Я работаю с данными временных рядов (общий доступ здесь ).

import numpy as np
import matplotlib.pyplot as plt

protocols = {}

types = {"data1": "data1.csv"}

for protname, fname in types.items():
    col_time,col_window = np.loadtxt(fname,delimiter=',').T
    trailing_window = col_window[:-1] 
    leading_window  = col_window[1:]  
    decreasing_inds = np.where(leading_window < trailing_window)[0]
    quotient = leading_window[decreasing_inds]/trailing_window[decreasing_inds]
    quotient_times = col_time[decreasing_inds]

    protocols[protname] = {
        "col_time": col_time,
        "col_window": col_window,
        "quotient_times": quotient_times,
        "quotient": quotient,
    }

    plt.figure(); plt.clf()
    plt.plot(quotient_times,quotient, ".", label=protname, color="blue")
    plt.ylim(0, 1.0001)
    plt.title(protname)
    plt.xlabel("time")
    plt.ylabel("quotient")
    plt.legend()
    plt.show()

Это дает следующий график с двумя точками (quotient), как показано выше в моем коде.

enter image description here

Мне было интересно, можно ли как-то добавить больше точек на графике выше, чтобы у него был тренд, подобный следующему.Возможно ли это сделать?

enter image description here

Например, если мы хотим изменить значения y-axis, мы можем сделать это легко, какследующий

factors = [100, 100, 100]
for (protname, values), m in zip(protocols.items(), factors):
    fig, ax1 = plt.subplots()
    ax1.hist(values["quotient"], facecolor='blue', alpha=0.9, label=protname,align='left')
    y_vals = ax1.get_yticks()
    ax1.set_yticklabels(['{:3.0f}'.format(x * m) for x in y_vals])
    ax1.set_xlabel("Values")
    ax1.set_title(protname)
    plt.legend()
    plt.show()

enter image description here

1 Ответ

0 голосов
/ 24 февраля 2019

Чтобы добавить промежуточные точки к вашим данным, вам нужно использовать некоторую форму интерполяция numpy есть np.interp, который обеспечивает простой интерфейс для предварительной линейной интерполяции.

Ниже приведен простой пример.

import numpy as np
import matplotlib.pyplot as plt

x = np.array([1,2,3,10,20,30])
y = np.array([1,2,3,4,5,6])

fig = plt.figure()
ax = fig.add_subplot(1,1,1)

ax.plot(x, y, '.', ms=10)

# Create a continuous range for the x axis from first to last value
xc = np.arange(x[0], x[-1])
yi = np.interp(xc, x, y)

ax.plot(xc, yi, 'x', color='r')

Это дает следующий график.

interpolated data and original data

Входные данные отображаются в виде синих кружков, интерполированные в виде красных крестиков.

Важно отметить, что для интерполяции ваших данныхсначала необходимо вычислить ось интерполированных данных (например, регулярный диапазон значений от min..max).Затем вы передаете эту новую ось вместе с вашими текущими x и текущими y значениями в np.interp.Результатом является новый набор y значений в интерполированных x местоположениях.

Используя ваш пример данных / сценария, вы можете сделать -

import numpy as np
import matplotlib.pyplot as plt

protocols = {}

types = {"data1": "data1_final.csv"}

for protname, fname in types.items():
    col_time,col_window = np.loadtxt(fname,delimiter=',').T
    trailing_window = col_window[:-1] 
    leading_window  = col_window[1:]  
    decreasing_inds = np.where(leading_window < trailing_window)[0]
    quotient = leading_window[decreasing_inds]/trailing_window[decreasing_inds]
    quotient_times = col_time[decreasing_inds]

    protocols[protname] = {
        "col_time": col_time,
        "col_window": col_window,
        "quotient_times": quotient_times,
        "quotient": quotient,
    }

    plt.figure(); plt.clf()

    plt.plot(quotient_times,quotient, ".", label=protname, color="blue")

    # Interpolate, along an axis from min..max quotient_times
    xc = np.arange(quotient_times[0], quotient_times[-1], 0.5)
    quotienti = np.interp(xc, quotient_times, quotient)

    plt.plot(xc, quotienti, 'x', color='r')    

    plt.ylim(0, 1.0001)
    plt.title(protname)
    plt.xlabel("time")
    plt.ylabel("quotient")
    plt.legend()
    plt.show()

, что приводит к следующему графику.

interp with provided data

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