Effacer les filtres
Effacer les filtres

Visualizing line plot with histogram density

6 vues (au cours des 30 derniers jours)
Mark
Mark le 12 Juil 2023
I have multiples line plots which overlaps each other and I would like to plot my data something like the figure below to represent my data more quantitatively. Please assist me to plot this figure.
This is what I have so far.
% Generate sample data
numProfiles = 300; % Number of temperature profiles
numAltitudes = 101; % Number of altitude points (from 0km to 100km with 1km increment)
altitude = 0:1:100; % Altitude values in km
temperatures = zeros(numAltitudes, numProfiles);
% Generate temperatures with increased variation in specific altitude ranges
baseTemperature = 200 + altitude' * 3; % Base temperature profile
% Generate variations for each profile
for i = 1:numProfiles
variation = zeros(numAltitudes, 1);
% Add varying magnitudes of variation at different altitude points
for j = 1:numAltitudes
if altitude(j) < 20
variation(j) = randn * 50; % Large variation
elseif altitude(j) < 50
variation(j) = randn * 10; % Increased variation
elseif altitude(j) < 70
variation(j) = randn * 3; % Moderate variation
else
variation(j) = randn * 1; % Very small variation
end
end
temperatures(:, i) = baseTemperature + variation;
end
% Create histogram bins to get data density for each slice of altitude
nbins = 40;
bins = linspace( min(temperatures(:)), max(temperatures(:)), nbins );
hc = NaN(numAltitudes,nbins-1);
for i = 1:numAltitudes
hc(i,:) = histcounts(temperatures(i,:), bins);
end
% Get the centre value of each histogram bin
temps = (bins(1:end-1)+bins(2:end))/2;
% Get the x/y values as a mesh to plot the surface
[x,y] = meshgrid( temps, altitude );
% Plotting
figure;
subplot(1,2,1);
hold on;
colors = lines(numProfiles); % Generate a color map with distinct colors
for i = 1:numProfiles
plot(temperatures(:, i),altitude, 'Color', colors(i, :)); % Assign distinct color to each plot
end
% Customize the plot
ylabel('Altitude (km)');
xlabel('Temperature (K)');
grid on;
% Plot a surface with no edges, where the z-direction indicates density
% Viewed from "above", this will look like a heatmap
subplot(1,2,2);
surface(x, y, hc);
ylabel('Altitude (km)');
xlabel('Temperature (K)');
% Create a colour map which fades from white -> blue -> green -> yellow -> red
c = interp1( 1:5, [1,1,1; 0,0.5,1; 0.2,1,0.2; 1,1,0; 1,0,0], linspace(1,5,20) );
colormap(c);
colorbar;
My current figure looks something like this.

Réponses (1)

Image Analyst
Image Analyst le 12 Juil 2023
Try this:
% Initialization steps.
clc; % Clear the command window.
close all; % Close all figures (except those of imtool.)
clear; % Erase all existing variables. Or clearvars if you want.
workspace; % Make sure the workspace panel is showing.
format short g;
format compact;
fontSize = 15;
fprintf('Beginning to run %s.m ...\n', mfilename);
% Generate sample data
numProfiles = 300; % Number of temperature profiles
numAltitudes = 101; % Number of altitude points (from 0km to 100km with 1km increment)
altitude = 0:1:100; % Altitude values in km
temperatures = zeros(numAltitudes, numProfiles);
% Generate temperatures with increased variation in specific altitude ranges
baseTemperature = 200 + altitude' * 3; % Base temperature profile
% Generate variations for each profile
for i = 1:numProfiles
variation = zeros(numAltitudes, 1);
% Add varying magnitudes of variation at different altitude points
for j = 1:numAltitudes
if altitude(j) < 20
variation(j) = randn * 50; % Large variation
elseif altitude(j) < 50
variation(j) = randn * 10; % Increased variation
elseif altitude(j) < 70
variation(j) = randn * 3; % Moderate variation
else
variation(j) = randn * 1; % Very small variation
end
end
temperatures(:, i) = baseTemperature + variation;
end
% Create histogram bins to get data density for each slice of altitude
nbins = 40;
bins = linspace( min(temperatures(:)), max(temperatures(:)), nbins );
hc = NaN(numAltitudes,nbins-1);
for i = 1:numAltitudes
hc(i,:) = histcounts(temperatures(i,:), bins);
end
% Get the centre value of each histogram bin
temps = (bins(1:end-1)+bins(2:end))/2;
% Get the x/y values as a mesh to plot the surface
[x,y] = meshgrid( temps, altitude );
% Plotting
figure;
subplot(1,2,1);
hold on;
colors = lines(numProfiles); % Generate a color map with distinct colors
for i = 1:numProfiles
plot(temperatures(:, i),altitude, 'Color', colors(i, :)); % Assign distinct color to each plot
end
% Customize the plot
ylabel('Altitude (km)');
xlabel('Temperature (K)');
grid on;
% Get mean temperature
meanTemperature = mean(temperatures, 2)';
% Plot mean temperature over other plots.
hold on;
plot(meanTemperature, altitude, 'k-', 'LineWidth', 4);
% Plot a surface with no edges, where the z-direction indicates density
% Viewed from "above", this will look like a heatmap
subplot(1,2,2);
surface(x, y, hc);
ylabel('Altitude (km)');
xlabel('Temperature (K)');
% Create a colour map which fades from white -> blue -> green -> yellow -> red
c = interp1( 1:5, [1,1,1; 0,0.5,1; 0.2,1,0.2; 1,1,0; 1,0,0], linspace(1,5,20) );
colormap(c);
colorbar;
% Plot mean temperature over surface.
hold on;
plot(meanTemperature, altitude, 'k-', 'LineWidth', 4);
% Maximize window
g = gcf;
g.WindowState = 'maximized';

Catégories

En savoir plus sur Data Distribution Plots dans Help Center et File Exchange

Produits


Version

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by