Visualizing line plot with histogram density
6 ビュー (過去 30 日間)
古いコメントを表示
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.
0 件のコメント
回答 (1 件)
Image Analyst
2023 年 7 月 12 日
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';
0 件のコメント
参考
カテゴリ
Help Center および File Exchange で Data Distribution Plots についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!