У меня есть набор данных, хранящихся в VTK-файле, который представляет собой разрез домена со скалярными точечными данными в массиве. Я пытаюсь создать контурный график упомянутого скаляра, чтобы он выглядел так же, как приложенная фотография с использованием ParaView. Я лучше придерживаюсь библиотек vtk, чем использовать что-то еще, например Matplotlib, так как я думаю, что они вообще улучшают визуализацию. .Контурный график из данных в файле vtk с использованием Python
Я просмотрел несколько примеров в режиме онлайн, но ни один из них не работает для меня (никаких ошибок не возникает, все, что у меня получается, - это пустой рендер только с фоном), все, что я смог сделать, это поверхностный график данных (например: here).
Вот текущая версия кода у меня есть (очень похожий на тот, который успешно производит поверхностный участок):
# import data
reader = vtk.vtkDataSetReader()
reader.SetFileName('inputDataFiles/k_zCut.vtk')
reader.ReadAllVectorsOn()
reader.ReadAllScalarsOn()
reader.Update()
# access data
data = reader.GetOutput()
d = data.GetPointData()
array=d.GetArray('k')
# create the filter
contours = vtk.vtkContourFilter()
contours.SetInput(reader.GetOutput())
contours.GenerateValues(5,1.,5.)
# create the mapper
mapper = vtk.vtkPolyDataMapper()
mapper.SetInput(contours.GetOutput())
mapper.ScalarVisibilityOff()
mapper.SetScalarRange(1., 5.)
# create the actor
actor = vtk.vtkActor()
actor.SetMapper(mapper)
# create a rendering window and renderer
ren = vtk.vtkRenderer()
ren.SetBackground(0.329412, 0.34902, 0.427451) #Paraview blue
# Assign actor to the renderer
ren.AddActor(actor)
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
renWin.SetSize(750, 750)
# create a renderwindowinteractor
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
# render
renWin.Render()
# screenshot
w2if = vtk.vtkWindowToImageFilter()
w2if.SetInput(renWin)
w2if.Update()
w2if.SetMagnification(5.)
writer = vtk.vtkPNGWriter()
writer.SetFileName("screenshot.png")
writer.SetInput(w2if.GetOutput())
writer.Write()
# Enable user interface interactor
iren.Initialize()
iren.Start()
Ниже вы можете увидеть сокращенную часть моего входного файла. Любая помощь будет высоко ценится.
# vtk DataFile Version 2.0
sampleSurface
ASCII
DATASET POLYDATA
POINTS 34813 float
0 0 0
0 -0.000191589 0
0.000264399 0.000157061 0
0 0.000313389 0
0.000264347 -0.000191923 0
0 -0.000383178 0
-0.000395709 0 0
-0.000395709 0.000156695 0
3.60174e-05 0.000486922 0
0.000528387 0 0
POLYGONS 69284 277136
3 4105 4371 3861
3 4102 3861 4371
3 4656 4371 4373
3 4105 4373 4371
3 3624 3861 3390
3 3621 3390 3861
3 4105 3863 3861
3 3624 3861 3863
3 3188 3390 2990
3 3187 2990 3390
3 3624 3390 3391
3 3188 3391 3390
POINT_DATA 34813
FIELD attributes 1
k 1 34813 float
0.849464 0.391519 1.52947 1.05206 0.391519 0.253736 1.39481 1.39481 0.636517 1.21019
0.640193 0.114295 1.12557 0.644143 0.629569 0.114295 0.485032 0.477396 1.39961 0.0860201
1.66665 1.24058 1.45939 0.483719 1.01318 0.163198 0.317574 0.792821 0.317125 0.658835
Hi! Большое спасибо за ответ. Похоже, что майави гораздо проще использовать, я посмотрю на него. Я боюсь, что у меня нет большого контроля над входным файлом, он приходит как есть. Не могли бы вы объяснить, как он «недействителен»? – Artur
@Artur - Я думаю, это просто потому, что вы усекали части файла, чтобы показывать в своем вопросе, не изменяя количество в каждом заголовке раздела. Исходный файл, вероятно, отлично. (Например, 'POINTS 34813 float' должен быть' POINTS 10 float', поскольку перечислены только 10 пунктов.) Также часть POLYGONS представляет собой список указателей в точках, поэтому все указанные номера недействительны, поскольку они 're больше 10. Опять же, исходный файл, вероятно, прекрасно, просто то, что вы дали в качестве примера в своем вопросе, недействительно точно так же, как и оно. –
Привет! Вы правы, я просто вырезал кусочки из него, чтобы сделать его компактным, на самом деле это слишком долго, чтобы его можно было опубликовать. Я намеренно оставил фактическое количество очков и полисов, поскольку я думал, что это может иметь значение. – Artur