Filter löschen
Filter löschen

How can a single line plot have two colors?

11 Ansichten (letzte 30 Tage)
Tunde Adubi
Tunde Adubi am 24 Jul. 2023
Kommentiert: Star Strider am 24 Jul. 2023
using x and y variables to make a single graph or line plot, how can the plot have two colors or more than one color?
This plot comes out black. How can the interval in the plot attached be red?
figure('position',[100 100 900 550])
hold on
plot(range,s_attenuation,'black', 'LineWidth', 1.5)
ylabel('Specific Attenuation (dB/km)')
xlabel('Range (km)')
title('Line plot')

Akzeptierte Antwort

Star Strider
Star Strider am 24 Jul. 2023
Use ‘logical indexing’:
figure
imshow(imread('plot.JPG'))
title('Original Function')
range = linspace(0,100,500);
s_attenuation = exp(-(range-46).^2/5) + 2*exp(-(range-47).^2/50);
Lv = s_attenuation >= 1.1; % Logical Vector
figure
plot(range, s_attenuation, 'b')
hold on
plot(range(Lv), s_attenuation(Lv), 'r')
hold off
grid
.
  2 Kommentare
Tunde Adubi
Tunde Adubi am 24 Jul. 2023
Thanks, what about working with two logical vectors (1.1) and (1.5) in the y interval?
Star Strider
Star Strider am 24 Jul. 2023
I assume you intend 1.1 on the left side and 1.5 on the right. In this example, that requires splitting it initially into two segments, then combining them —
range = linspace(0,100,500).'; % Assume Column Vectors
s_attenuation = exp(-(range-46).^2/5) + 2*exp(-(range-47).^2/50);
[~,locs] = max(s_attenuation); % Use 'findpeaks' For More Than One Maximum
locs = [1; locs; numel(range)]; % Augment 'locs' To Include First % Last Indices
v = [1.1; 1.5]; % Values To Comopare
Lv = false(size(range)); % Preallocate
for k = 1:numel(locs)-1
idxrng = locs(k) : locs(k+1); % Index Range For Each Segment
Lv(idxrng) = s_attenuation(idxrng) >= v(k); % Logical Vector
end
figure
plot(range, s_attenuation, 'b')
hold on
plot(range(Lv), s_attenuation(Lv), 'r')
hold off
grid
grid minor
I coded this to be generalisable to more peaks, so that should work, although with some modifications depending on the data. Since each peak would have to be considered separately, creating ‘locs’ would need to take that into consideration. Assuming one peak, this should work without modification.
If I had your data, I could do it with your function.
.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Sam Chak
Sam Chak am 24 Jul. 2023
If you have the data, and you can find exactly where the two intervals are from scrutizing the data, then you can make the first plot, picking the color hex you like, then retain current plot using 'hold on' when adding another plot. See example below.
You can also use findchangepts() command to find abrupt changes in the signal, if the data has too many points for you to manually scrutize.
% data
x = linspace(0, 1, 1001);
y1 = sin(2*pi*x(1:500));
y2 = sin(2*pi*x(501:end));
% plots
plot(x(1:500), y1, 'linewidth', 2, 'color', '#63c3de'), hold on
plot(x(501:end), y2, 'linewidth', 2, 'color', '#efb255'), hold off
xline(0.5, '--')
% labels
xlabel('x'), ylabel('y')
ylim([-1.5 1.5])
grid on
  2 Kommentare
Tunde Adubi
Tunde Adubi am 24 Jul. 2023
Bearbeitet: Tunde Adubi am 24 Jul. 2023
Thanks Man. I tried it but array indices must only be logical values or positive integers to execute this method.
Sam Chak
Sam Chak am 24 Jul. 2023
@Tunde Adubi, Can you check whether the variables in your script are overshadowed by the variables having the same name in your workspace?

Melden Sie sich an, um zu kommentieren.

Community Treasure Hunt

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

Start Hunting!

Translated by