3
$\begingroup$

I have an external python code that computes a bunch of data, which I read into Mathematica as a table, so: Import["Documents\Hubbard\Python\data.dat", "Table"];

These files are quite large so I couldn't show them in their entirety here, but they look something like {{x0,y0,z0},{x1,y1,z1},...} and so on for let's say N coordinate triplets.

Now, ListPlot3D or ListPointPlot3D work fine for plotting this data, but my isse is that I do not want a surface, not even with the default mesh lines in the x- and y-directions.

How do I plot this data with only having mesh lines going along one of the coordinates? Look in the image below for what I would like to have. I tried Mesh command but it doesn't seem to work well with the above Plot commands - and honestly the Help pages sound a bit like gibberish to me.

Any ideas?

Edit: Forgot to add the closest "guess" I have for a command line:

ListPointPlot3D[SC, MeshFunctions -> {#1 &, None}]

Where I'm using ListPointPlot to avoid the automatic surface that ListPlot creates, however the command creates an error :-(

Example

$\endgroup$

3 Answers 3

3
$\begingroup$

Using example data from DanielHuber's answer:

SeedRandom[1]
d = Table[{x, y, RandomReal[3 {-1, 1}]}, {x, 5}, {y, 20}];

1. ListPlot3D + MeshFunctions

lp3d = ListPlot3D[Join @@ d, PlotStyle -> None, 
  MeshFunctions -> {# &}, 
  Mesh -> {{#, ColorData[97]@#} & /@ Range[5]},
  MeshStyle -> Thick, 
  BoundaryStyle -> None]

enter image description here

Use MeshFunctions -> {#2 &} and Mesh -> {{#, ColorData[97]@#} & /@ Range[20]} to get mesh lines in y direction:

enter image description here

2. ListPointPlot3D + DisplayFunction

ListPointPlot3D[d, 
 DisplayFunction -> (Show @* ReplaceAll[Point -> Line])]

enter image description here

Use GatherBy to group input data by the y values to get

ListPointPlot3D[GatherBy[Join @@ d, #[[2]] &], 
 DisplayFunction -> (Show@*ReplaceAll[Point -> Line])]

enter image description here

3. ListPointPlot3D + post-processing

lpp3d = ListPointPlot3D[d]

enter image description here

lpp3d /. p_Point :> {p, Line @@ p}

enter image description here

ListPointPlot3D[GatherBy[Join @@ d, #[[2]] &]] /. p_Point :> {p, Line @@ p}

enter image description here

$\endgroup$
2
$\begingroup$

Assume that your data has the form: {{{x1,y,z},{x1,y,z}..},{{x2,y,z},..},..} where the x coordinates are the same for all points on the same line.

We may create some test data like:

d = Table[{x, y, RandomReal[3 {-1, 1}]}, {x, 5}, {y, 20}];

To draw every line in a different color, we use "Hue" and a count:

c = 0;
Graphics3D[{Hue[0.2 c++], Line[#]} & /@ d, Axes -> True, 
 AspectRatio -> .5, AxesLabel -> {"x", "y", "z"}]

enter image description here

Feel free to adjust the parameters like AspectRatio, Labels and Hue to your needs.

$\endgroup$
2
  • $\begingroup$ Hey thanks for your answer! Unfortunately the data points are not structured in such a way and due to the nature of the code it might take a small effort to re-write the export procedure from python, but it might just be worth it though. Isn't there a way to just take a bunch of points, plot them, and then run a mesh in one direction (Hue doesn't matter btw), let's say the x direction? What I'm thinking is that since the default is to have meshes in both x and y, I'd be asking to remove the y-lines but keep the lines in the x direction. Thanks for taking time to answer, I appreciate it! $\endgroup$
    – user79724
    Commented Apr 29, 2021 at 15:56
  • $\begingroup$ I only draw lines, with this, a mesh will be points. If you want to have mesh-lines, you need to draw a surface, but if I understood correctly, you do not want to draw a surface. A way around this: draw a surface and mesh in x-direction and set the opacity of "PlotStyle" to zero. Then you only see the gridlines without the surface. $\endgroup$ Commented Apr 29, 2021 at 16:09
1
$\begingroup$

Maybe I’ve misunderstood this, but...using the example data from DanielHuber’s answer:

SeedRandom[1];
d = Table[{x, y, RandomReal[3 {-1, 1}]}, {x, 5}, {y, 20}];

We can simply use the new in 12.3 ListLinePlot3D:

ListLinePlot3D[d]

output of the above block of code

To get the other orthogonal direction, with your formatting of list we can simply take the Transpose of the list:

ListLinePlot3D[Transpose[d]]

output of the above block of code

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.