Как построить несколько списков на одном графике одной строкой? - PullRequest
0 голосов
/ 05 ноября 2019

Я хотел бы создать график, который будет представлять изменчивость некоторого параметра, связанного с определенным геологическим слоем «пирога». У меня есть профиль с заданной верхней и нижней глубиной каждой поверхности и значением некоторого физического параметра для каждого слоя. Верх и низ имеют форму интервалов (например, [0-5, 2]; [5-7, 1.8] и т. Д.). Я хотел бы иметь один график с полным профилем в виде одной непрерывной линии. Данные хранятся в виде таблицы в формате csv со столбцами, названными следующим образом: | TOP || BOTTOM || VALUE |

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

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

with open('data.csv', newline='') as file:
    file = csv.reader(file, delimiter=';', quotechar='|')
    headers = next(file)
    table = list(file) 
    result = []
    for line in table:
        top = float(line[0])
        bottom = float(line[1])
        value = float(line[2])
        l = np.arange(top, bottom+1, 1)
        Z = [value]*len(l)

        ax.plot(Z, l)
        ax = plt.axes()
    #ax.set_ylim([55,-1])
    #ax.set_xlim([1,3])
    plt.show()

Мои результаты представлены на рис. 1. Но я бы хотел получить что-то похожее на рис. 2: https://imgur.com/a/RHtvfQL

Я использую Spyder 3.6.

Можно ли создать одну непрерывную линию из разных списков? Я не привязан к этому решению. Спасибо за любые предложения.

1 Ответ

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

Вы можете построить горизонтальные линии между вертикальными полосами, используя hlines (составленный из поддельных данных, похожих на ваши):

import numpy as np
from matplotlib import pyplot

random_data = [5, 8, 17, 25, 32, 50]
values = [1.5, 2.3, 1.7, 2.5, 1.8, 1.8]  # Note last value should be duplicate

for i in range(len(random_data) - 1):
        top = float(random_data[i])
        bottom = float(random_data[i + 1])
        value = float(values[i])
        value_next = float(values[i + 1])

        l = np.arange(top, bottom + 1, 1)
        Z = [value]*len(l)

        pyplot.plot(Z, l)
        pyplot.hlines(bottom, value, value_next)

pyplot.show()

enter image description here

Обратите внимание, что вы также можете легче строить вертикальные линии, используя vlines:

import numpy as np
from matplotlib import pyplot

random_data = [5, 8, 17, 25, 32, 50]
values = [1.5, 2.3, 1.7, 2.5, 1.8, 1.8]  # Note last value should be duplicate

for i in range(len(random_data) - 1):
        top = float(random_data[i])
        bottom = float(random_data[i + 1])
        value = float(values[i])
        value_next = float(values[i + 1])

        pyplot.vlines(value, top, bottom)
        pyplot.hlines(bottom, value, value_next)

pyplot.show()

enter image description here

Возможно, вам придется поиграть спределы данных, но это даст вам то, что вы хотите.

...