Как обернуть график, если значение превышает xlim в matplotlib - PullRequest
1 голос
/ 07 октября 2019

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

Plot that I've made using matplotlib.

Мой код:

_, ax = plt.subplots(1,1, figsize = (5,20))
ax2 = ax.twiny()
ax.plot(df.GR, df.DEPT, 'red')
ax2.plot(df.SP, df.DEPT, 'blue')
ax.set_xlim(0, 150)
ax2.set_xlim(50, 90)
ax.set_xlabel('GR')
ax2.set_xlabel('SP')
ax.grid()
ax.set_xticks([0,15,30,45,60,75,90,105,120,135,150])
_.legend(['GR', 'SP'], bbox_to_anchor=(0.85,0.78), fontsize = 15)

Желаемыйсюжет:

Desired plot that I don't know which programming language made it.

Посмотрите на последнюю толстую сетку между 3900 м и 3925 м, где вы увидите, что когда значение превысило xlim max, оно обернулось вокруг и пришло излевая сторона графика, т.е. xlim минимальная сторона.

Также я хочу скопировать тот же стиль отображения легенды, что и на желаемом графике.

1 Ответ

0 голосов
/ 07 октября 2019

Для «обтекания» вам придется добавить еще одну ось и отдельно контролировать ее пределы. Для легенды не существует элегантного решения, но вы можете вручную настроить все аспекты маркировки по оси X. Например:

import numpy as np
import matplotlib.pyplot as plt

# Make some fake data.
y = np.linspace(0, 1000)
x1 = np.sin(y / 100) + 1.1 + 0.5 * np.random.random(50)

# Make the plot.
fig, ax = plt.subplots(figsize=(3, 10))
ax_wrap = ax.twiny()
ax_wrap.axis('off')

# Plot x1 in blue.
ax.plot(x1, y)
ax.set_xlim(0, 1.5)
ax_wrap.plot(x1, y, '--')  # <-- This is the wrapped data.
ax_wrap.set_xlim(1.5, 3.0) # <-- Wrapped data's limits.

# Adjust the x-axis position and colour.
ax.set_xticks((0, 1.5))
ax.spines['top'].set_position(('outward', 10))
ax.spines['top'].set_color('C0')
ax.xaxis.set_ticks_position('top')
ax.xaxis.set_label_position('top')
ax.xaxis.set_label_coords(0.5, 1.03)
ax.set_xlabel('GR', color='C0', size=20)
ax.tick_params(axis='x', colors='C0', size=0)

Это приводит к:

Resulting output

Печать журналов - это немного головная боль. Возможно, вы захотите взглянуть на следующие библиотеки, которые могут помочь в некоторых ваших работах:

  • petropy - я не использовал его, но сюжет настраница GitHub выглядит довольно мило.
  • welly - не решает эту конкретную проблему, но я только что сделал проблему для нее.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...