How to smooth out plotted points in a graph/figure?

3 views (last 30 days)
Hello everyone! I have a question concerning the plot. I'm working on a simple tool that plots automatically squares based on a MATLAB code that I wrote. The code is actually working perfectly, and it is able to determine on which coordinates each point should be. The code is very long, so I won't be posting it here (unless a segment of the code is required for my request of course). The thing is that I am plotting these points as "squares" and the code automatically knows exactly which color to choose in every case. It is a very long iteration and after around 10 minutes, I get a figure that looks like the one I just uploaded.
As you can see, each point that is plotted is a "square" with a certain "MarkerSize":
plot(i, j, 's', 'color', colorselected, 'MarkerSize', 11.5, 'MarkerFaceColor', colorselected);
This covers the figure, however it doesn't provide that smoothness that I am looking for. It looks something like an extremely pixelated figure. I am trying to figure out a way to have a sort of dividing diagonal between the parts that the colors start to change. The thing is that if I increase the number of iterations, it can take up to 1 hour of plotting, if not more, and honestly that's just far too long (plotting over 10000 individual points). I did try it out, and it did yield much better results, but obviously it isn't an optimal solution.
I have also tried using the "area" function in MATLAB, with their corresponding color, of course, but it backfired. It did not resemble the graphs that were plotted individually at all! I did follow through with it logically though. I created a method that calculates, checks the value received based on what I require as a value, and then put that value in an array that contains the xy coordinates (so a 2D array). There are a total of 8 colors, thus 8 distinct 2D arrays. What I was always getting, however, are huge square areas/figures completely filled with ONLY ONE COLOR!. Here is a simple example of what I meant:
if(yellowplot~=0)
area([min(yellowplot(1,:)), min(yellowplot(1,:)), max(yellowplot(1,:)), max(yellowplot(1,:))], [min(yellowplot(2,:)), max(yellowplot(2,:)), min(yellowplot(2,:)), max(yellowplot(2,:))], 'FaceColor', 'y');
end
hold on;
if(magentaplot~=0)
area([min(magentaplot(1,:)), min(magentaplot(1,:)), max(magentaplot(1,:)), max(magentaplot(1,:))], [min(magentaplot(2,:)), max(magentaplot(2,:)), min(magentaplot(2,:)), max(magentaplot(2,:))], 'FaceColor', 'm');
end
hold on;
if(cyanplot~=0)
area([min(cyanplot(1,:)), min(cyanplot(1,:)), max(cyanplot(1,:)), max(cyanplot(1,:))], [min(cyanplot(2,:)), max(cyanplot(2,:)), min(cyanplot(2,:)), max(cyanplot(2,:))], 'FaceColor', 'c')
end
hold on;
if(redplot~=0)
area([min(redplot(1,:)), min(redplot(1,:)), max(redplot(1,:)), max(redplot(1,:))], [min(redplot(2,:)), max(redplot(2,:)), min(redplot(2,:)), max(redplot(2,:))], 'FaceColor', 'r')
end
hold on;
if(greenplot~=0)
area([min(greenplot(1,:)), min(greenplot(1,:)), max(greenplot(1,:)), max(greenplot(1,:))], [min(greenplot(2,:)), max(greenplot(2,:)), min(greenplot(2,:)), max(greenplot(2,:))], 'FaceColor', 'g')
end
hold on;
if(blueplot~=0)
area([min(magentaplot(1,:)), min(blueplot(1,:)), max(blueplot(1,:)), max(blueplot(1,:))], [min(blueplot(2,:)), max(blueplot(2,:)), min(blueplot(2,:)), max(blueplot(2,:))], 'FaceColor', 'b')
end
hold on;
if(orangeplot~=0)
area([min(orangeplot(1,:)), min(orangeplot(1,:)), max(orangeplot(1,:)), max(orangeplot(1,:))], [min(orangeplot(2,:)), max(orangeplot(2,:)), min(orangeplot(2,:)), max(orangeplot(2,:))], 'FaceColor', [1 0.270588 0])
end
hold on;
if(blackplot~=0)
area([min(blackplot(1,:)), min(blackplot(1,:)), max(blackplot(1,:)), max(blackplot(1,:))], [min(blackplot(2,:)), max(blackplot(2,:)), min(blackplot(2,:)), max(blackplot(2,:))], 'FaceColor', 'k')
end
hold on;
I even removed the "Hold on" command in one instance to see what is actually being drawn in INDIVIDUAL figures (yes, I called the "Figure" function in every "if" case) and it still just plotted a huge square. I don't know why it didn't properly plot everything properly as it should have (like taking the minimum and maximum points of each array and then filling in the area using these 4 points).
Any help would be greately appreciated! Thank you!

Answers (1)

Steven Lord
Steven Lord on 27 Jan 2021
Rather than creating one line per point I would consider using either scatter or one line per point color.
xy = rand(10, 2);
scatter(xy(:, 1), xy(:, 2), 49, rand(10, 3), 'Marker', 's')
  1 Comment
Jean-Pierre Asdiguian
Jean-Pierre Asdiguian on 27 Jan 2021
Could you please elaborate on what you mean by "creating one line per point"? Also, the scatter option is nice, but it is doing exactly the same thing I did (except I did it manually, instead of using the scatter function). The points that are plotted as squares have a purpose, and they cannot be randomized. The figure I had attached with my question explains the first scenario that I have attempted. The lines are actually not being plotted. There are no lines. They are just squares of exactly the same size and dimensions being plotted point by point based on a calculation that decides which color is best to be put there. It's a long code, so I'm not going to explain it here, but I guess I could try explaining the concept behind it if necessary.
By the way, I also tried plotting different symbols for every type of color, but that wasn't really any better. It just made it harder to look at.

Sign in to comment.

Categories

Find more on Line Plots in Help Center and File Exchange

Products

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!