Мне трудно понять эту проблему вложенного цикла 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
Кто-нибудь знает, как решить эту проблему? Спасибо!
Спасибо за ответ, я только что попробовал, но, к сожалению, он все еще перекрывается @r-beginners
У вас есть образцы данных, которые вы можете представить? Пожалуйста, вставьте его в вопрос. Исходя из этого, я попробую ваш код.
Я поместил свои данные на gdrive как csv, ссылка теперь в моем отредактированном вопросе. Спасибо за ответ! @r-новички
Ошибка, по-видимому, вызвана проблемой с настройкой журнала оси 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»
Когда я проверил содержимое окончательного списка, там было 12 имен файлов html вместо 2. Я изменил отступ, чтобы добавить в список.
Не знаю, как у вас, но у меня по-прежнему перекрываются участок 1 и участок 2 для второго участка, который находится в «Колодце 2F», похоже, проблема не в настройке журнала.
Ваш код дважды сохраняет график из 6 столбцов в файл формата html и, наконец, сохраняет имя файла html в списке. Я правильно понимаю, или это цель графика 2 строки по 6 столбцов?
Пожалуйста, проверьте последовательность сбора данных, построения графика и создания html-файла в среде Colab. Пожалуйста, попробуйте запустить то же самое в своей среде. Ваши комментарии отключат эту ссылку.
здесь я даю вам ссылку, что у вас все еще есть перекрывающееся изображение сравнение между вашим графиком и неперекрывающимся графиком Я помещаю изображение на тот же gdrive, что и данные, которые я загрузил
Настройте совместное использование оси Y и отключите обратный порядок оси Y, проверьте Colab.
все еще создается перекрывающееся изображение
Colab был восстановлен до исходного состояния. Удалите ось Y в своем коде, измените интервал по горизонтали и посмотрите, все ли оси Y одинаковы. Если данные совпадают, оставшаяся шкала оси Y вызывает подозрения.
хорошо, чувак, спасибо за помощь, я очень ценю это
В чем причина? Это конец?
Я до сих пор не знаю, чувак, я пробую твой совет, отменить ось Y, изменить горизонтальный интервал, отменить ось Y, даже я пытался изменить данные с другими данными, но все равно график 1 перекрывает график 2. Может быть, сюжетно ошибка во вложенном цикле for, я не знаю, чувак
Так что до сих пор не доработано. Это будет мой последний комментарий, но моя среда — последняя версия, 5.13.0. Какую версию ты используешь?
такой же как ты, 5.13.0
эй, я просто хочу дать вам обновление, похоже, что Plotly дает ошибку, когда вы пытаетесь построить график во вложенном цикле for, альтернативный способ заключается в том, что вы должны сами создать определенную функцию, а затем зациклить ее через свою функцию
Нашел решение, если вы хотите построить график с помощью 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])
Я думаю, что графики перекрываются, потому что они имеют одну и ту же ось Y, поэтому я отключил ее.
shared_yaxes=False