Мой первый график, перекрывающий мой второй график во вложенном цикле for (Python/Plotly)

Мне трудно понять эту проблему вложенного цикла for, я хочу сделать автоматизированный график, используя вложенный цикл for в графике, но мой первый график получился из-за того, что первый цикл перекрывает мой второй график

Вот мой код

#Read all the well log data
paths = sorted(glob.glob(os.path.join("well_contoh", "*.LAS")))
well_df = [0]*2
for i in range(len(paths)):
    well = lasio.read(paths[i])
    df = well.df()
    well_df[i] = df.reset_index()
well1, well2 = well_df #only 2 wells


#Automatic well log plots if any well log data comes in in the future
html_list = []
dataframe_well = {'Well 1F':well1, 'Well 2F':well2} #defining dataframe

wells = ['Well 1F','Well 2F'] #list of well for looping

#list of longitude and latitude for well 1 and well 2 respectively (a dummy coordinate)
Longitude = [96.083956, 96.356427]
Latitude = [5.456862, 5.328133]

#list of logs and their colors
logs = ['CALI', 'GR', 'RT', 'NPHI', 'RHOB', 'DT']
colors = ['black', 'green', 'red', 'royalblue', 'mediumaquamarine', 'goldenrod']

#plot
log_cols = np.arange(1,8)
logplot = make_subplots(rows=1, cols=len(logs), shared_yaxes = True, specs=[[{},{},{},{},{},{}]], 
                        horizontal_spacing=0.005)

for i in range(len(wells)):
    for j in range(len(logs)):
        if j == 2:
            logplot.add_trace(go.Scatter(x=dataframe_well[wells[i]][logs[j]], y=dataframe_well[wells[i]]['DEPTH'], name=logs[j], line_color=colors[j]), row=1, col=log_cols[j])
            logplot.update_xaxes(type='log', row=1, col=log_cols[j], title_text=logs[j], tickfont_size=12, linecolor='#585858')
        else:
            logplot.add_trace(go.Scatter(x=dataframe_well[wells[i]][logs[j]], y=dataframe_well[wells[i]]['DEPTH'], name=logs[j], line_color=colors[j]), row=1, col=log_cols[j])
            logplot.update_xaxes(col=log_cols[j], title_text=logs[j], linecolor='#585858')
    
    logplot.update_xaxes(showline=True, linewidth=2, linecolor='black', mirror=True, ticks='inside', tickangle=45)
    logplot.update_yaxes(tickmode='linear', tick0=0, dtick=250, showline=True, linewidth=2, ticks='outside', mirror=True, linecolor='black')
    logplot.update_yaxes(row=1, col=1, autorange='reversed')
    logplot.update_layout(height=700, width=800, showlegend=False)
    logplot.update_layout(
                 title_text = "Example of " + '<b>' + str(wells[i]) + '</b>', #Add a chart title
                 title_font_family = "Arial",
                 title_font_size = 25, title_x=0.5)

    logplot.write_html('fig'+str(wells[i])+'.html') # the plot is automatically saved as html

    #list html plots to show what pop up folium should show on the map
    html_list.append('fig'+str(wells[i])+'.html')

и полученный график для второй итерации, который Well 2F (перекрывающееся изображение), это

сюжет должен быть примерно таким (не перекрывающееся изображение)

Well 2F график, кажется, перекрывается Well 1F графиком, и проблема здесь должна быть вложенным циклом, который я использую для

Вот фиктивные данные, если кто-то захочет попробовать

https://drive.google.com/drive/folders/1DCnNpXpgqVCYNaMiD7FX6CpVqsOl3mkX?usp=share_link

Кто-нибудь знает, как решить эту проблему? Спасибо!

Я думаю, что графики перекрываются, потому что они имеют одну и ту же ось Y, поэтому я отключил ее. shared_yaxes=False

r-beginners 24.01.2023 04:17

Спасибо за ответ, я только что попробовал, но, к сожалению, он все еще перекрывается @r-beginners

naranara2 24.01.2023 04:22

У вас есть образцы данных, которые вы можете представить? Пожалуйста, вставьте его в вопрос. Исходя из этого, я попробую ваш код.

r-beginners 24.01.2023 04:28

Я поместил свои данные на gdrive как csv, ссылка теперь в моем отредактированном вопросе. Спасибо за ответ! @r-новички

naranara2 24.01.2023 04:37
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
108
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ошибка, по-видимому, вызвана проблемой с настройкой журнала оси X, поэтому настройка журнала оси X была установлена ​​в одной строке.

import plotly.graph_objects as go
from plotly.subplots import make_subplots

logplot = make_subplots(rows=1,
                        cols=len(logs),
                        shared_yaxes = False,
                        #specs=[[{},{},{},{},{},{}]], 
                        horizontal_spacing=0.08,
                        vertical_spacing=0.08
                       )

for i in range(len(wells)):
    for j in range(len(logs)):
        logplot.add_trace(go.Scatter(
            x=dataframe_well[wells[i]][logs[j]],
            y=dataframe_well[wells[i]]['DEPTH'],
            name=logs[j],
            line_color=colors[j]),
                          row=1, col=log_cols[j])

        logplot.update_xaxes(showline=True, linewidth=2, linecolor='black', mirror=True, ticks='inside', tickangle=45)
        logplot.update_yaxes(tickmode='linear', tick0=0, dtick=250, showline=True, linewidth=2, ticks='outside', mirror=True, linecolor='black')
        logplot.update_yaxes(row=1, col=1, autorange='reversed')
        logplot.update_layout(height=700, width=800, showlegend=False)
        logplot.update_layout(
                     title_text = "Example of " + '<b>' + str(wells[i]) + '</b>', #Add a chart title
                     title_font_family = "Arial",
                     title_font_size = 25, title_x=0.5)
        logplot.update_layout(xaxis3=dict(type='log')) # update
        logplot.write_html('fig'+str(wells[i])+'.html') # the plot is automatically saved as html

        #list html plots to show what pop up folium should show on the map
    html_list.append('fig'+str(wells[i])+'.html')
    logplot.show()

спасибо, что попытались ответить на мой вопрос, я попробовал ваше решение, но кажется, что вложенный цикл не зацикливается, как должно быть, график выдает только «Ну 1F», вы открыли второй график в HTML? вы получили тот же результат, что и я? потому что я получил тот же результат между графиком 1 и графиком 2, только «Ну 1F»

naranara2 24.01.2023 08:11

Когда я проверил содержимое окончательного списка, там было 12 имен файлов html вместо 2. Я изменил отступ, чтобы добавить в список.

r-beginners 24.01.2023 08:25

Не знаю, как у вас, но у меня по-прежнему перекрываются участок 1 и участок 2 для второго участка, который находится в «Колодце 2F», похоже, проблема не в настройке журнала.

naranara2 24.01.2023 08:38

Ваш код дважды сохраняет график из 6 столбцов в файл формата html и, наконец, сохраняет имя файла html в списке. Я правильно понимаю, или это цель графика 2 строки по 6 столбцов?

r-beginners 24.01.2023 09:14

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

r-beginners 24.01.2023 09:23

здесь я даю вам ссылку, что у вас все еще есть перекрывающееся изображение сравнение между вашим графиком и неперекрывающимся графиком Я помещаю изображение на тот же gdrive, что и данные, которые я загрузил

naranara2 24.01.2023 09:51

Настройте совместное использование оси Y и отключите обратный порядок оси Y, проверьте Colab.

r-beginners 24.01.2023 10:05

все еще создается перекрывающееся изображение

naranara2 24.01.2023 10:18

Colab был восстановлен до исходного состояния. Удалите ось Y в своем коде, измените интервал по горизонтали и посмотрите, все ли оси Y одинаковы. Если данные совпадают, оставшаяся шкала оси Y вызывает подозрения.

r-beginners 24.01.2023 10:30

хорошо, чувак, спасибо за помощь, я очень ценю это

naranara2 24.01.2023 10:39

В чем причина? Это конец?

r-beginners 24.01.2023 10:42

Я до сих пор не знаю, чувак, я пробую твой совет, отменить ось Y, изменить горизонтальный интервал, отменить ось Y, даже я пытался изменить данные с другими данными, но все равно график 1 перекрывает график 2. Может быть, сюжетно ошибка во вложенном цикле for, я не знаю, чувак

naranara2 24.01.2023 10:55

Так что до сих пор не доработано. Это будет мой последний комментарий, но моя среда — последняя версия, 5.13.0. Какую версию ты используешь?

r-beginners 24.01.2023 11:01

такой же как ты, 5.13.0

naranara2 24.01.2023 12:01

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

naranara2 27.01.2023 05:01
Ответ принят как подходящий

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

в первую петлю, поставить перед входом во вторую петлю

logplot.data = []

вот полный код

def wellplot(wellx, title): #Update (defined function)
    for j in range(len(logs)):
        if j == 2: #change to log for RT
            logplot.add_trace(go.Scatter(
                x=wellx[logs[j]], 
                y=wellx['DEPTH'], 
                name=logs[j], 
                line_color=colors[j]), 
                            row=1, col=log_cols[j])
            logplot.update_xaxes(type='log', row=1, col=log_cols[j], title_text=logs[j], tickfont_size=12, linecolor='#585858')
        else:
            logplot.add_trace(go.Scatter(
                x=wellx[logs[j]],
                y=wellx['DEPTH'], 
                name=logs[j], 
                line_color=colors[j]), row=1, col=log_cols[j])
            logplot.update_xaxes(col=log_cols[j], title_text=logs[j], linecolor='#585858')

    logplot.update_xaxes(showline=True, linewidth=2, linecolor='black', mirror=True, ticks='inside', tickangle=45)
    logplot.update_yaxes(tickmode='linear', tick0=0, dtick=250, showline=True, linewidth=2, ticks='outside', mirror=True, linecolor='black')
    logplot.update_yaxes(row=1, col=1, autorange='reversed')
    logplot.update_layout(height=700, width=700, showlegend=False)
    logplot.update_layout(
                title_text = "Example of " + '<b>' + title + '</b>', #Add a chart title
                title_font_family = "Arial",
                title_font_size = 25, title_x=0.5)
    
    logplot.write_html('fig'+title+'.html') # the plot is automatically saved as html
    #list html plots to show what pop up folium should show on the map
    html_list.append('fig'+title+'.html')
    logplot.show()

for i in range(len(wells)):
    logplot.data = [] #put this to clear the plot content (in order to make it non-overlapping)
    wellplot(dataframe_well[wells[i]], wells[i])

Другие вопросы по теме