How to plot XRD data as 3D plot?
显示 更早的评论
I have a series of XRD diffractograms from a single sample, at different depths. I want to plot the spectra as a 3D line plot, as seen as below:

(From https://link.springer.com/article/10.1016%2FS1672-6529%2806%2960003-6)
I use the following code to view my XRD data in Matlab:
data = importdata('example_data.dat') ; % load the data from text file
semilogy(data(:,1),data(:,2)) ; % plot the data
How do I go from here?
TIA
采纳的回答
Star Strider
2021-9-7
编辑:Star Strider
2021-9-7
When I click on the link, I get a ‘DOI Not Found’ error. (EDIT — The new link is to an article behind a paywall, so I do not have access to it.)
That problem aside, if the data are in a matrix, it is likely possible just use surf to plot the matrix. The axis tick labels might need to be added manually in separate statements, however this is not difficult.
If you want to upload / attach the .XRD file, it would be necessary to put it into a .zip file first. Any information you have on its contents and format would be helpful, since I dioubt many here are familiar with that format (I am not, since .dat files can contain anything).
The complete matrix, with the values imported and plotted —
Uz = unzip('Plot3D[1].zip')
Uz = 1×103 cell array
{'Plot3D/569965_0-0.dat'} {'Plot3D/569965_0-1.dat'} {'Plot3D/569965_0-10.dat'} {'Plot3D/569965_0-100.dat'} {'Plot3D/569965_0-101.dat'} {'Plot3D/569965_0-102.dat'} {'Plot3D/569965_0-11.dat'} {'Plot3D/569965_0-12.dat'} {'Plot3D/569965_0-13.dat'} {'Plot3D/569965_0-14.dat'} {'Plot3D/569965_0-15.dat'} {'Plot3D/569965_0-16.dat'} {'Plot3D/569965_0-17.dat'} {'Plot3D/569965_0-18.dat'} {'Plot3D/569965_0-19.dat'} {'Plot3D/569965_0-2.dat'} {'Plot3D/569965_0-20.dat'} {'Plot3D/569965_0-21.dat'} {'Plot3D/569965_0-22.dat'} {'Plot3D/569965_0-23.dat'} {'Plot3D/569965_0-24.dat'} {'Plot3D/569965_0-25.dat'} {'Plot3D/569965_0-26.dat'} {'Plot3D/569965_0-27.dat'} {'Plot3D/569965_0-28.dat'} {'Plot3D/569965_0-29.dat'} {'Plot3D/569965_0-3.dat'} {'Plot3D/569965_0-30.dat'} {'Plot3D/569965_0-31.dat'} {'Plot3D/569965_0-32.dat'} {'Plot3D/569965_0-33.dat'} {'Plot3D/569965_0-34.dat'} {'Plot3D/569965_0-35.dat'} {'Plot3D/569965_0-36.dat'} {'Plot3D/569965_0-37.dat'} {'Plot3D/569965_0-38.dat'} {'Plot3D/569965_0-39.dat'} {'Plot3D/569965_0-4.dat'} {'Plot3D/569965_0-40.dat'} {'Plot3D/569965_0-41.dat'} {'Plot3D/569965_0-42.dat'} {'Plot3D/569965_0-43.dat'} {'Plot3D/569965_0-44.dat'} {'Plot3D/569965_0-45.dat'} {'Plot3D/569965_0-46.dat'} {'Plot3D/569965_0-47.dat'} {'Plot3D/569965_0-48.dat'} {'Plot3D/569965_0-49.dat'} {'Plot3D/569965_0-5.dat'} {'Plot3D/569965_0-50.dat'} {'Plot3D/569965_0-51.dat'} {'Plot3D/569965_0-52.dat'} {'Plot3D/569965_0-53.dat'} {'Plot3D/569965_0-54.dat'} {'Plot3D/569965_0-55.dat'} {'Plot3D/569965_0-56.dat'} {'Plot3D/569965_0-57.dat'} {'Plot3D/569965_0-58.dat'} {'Plot3D/569965_0-59.dat'} {'Plot3D/569965_0-6.dat'} {'Plot3D/569965_0-60.dat'} {'Plot3D/569965_0-61.dat'} {'Plot3D/569965_0-62.dat'} {'Plot3D/569965_0-63.dat'} {'Plot3D/569965_0-64.dat'} {'Plot3D/569965_0-65.dat'} {'Plot3D/569965_0-66.dat'} {'Plot3D/569965_0-67.dat'} {'Plot3D/569965_0-68.dat'} {'Plot3D/569965_0-69.dat'} {'Plot3D/569965_0-7.dat'} {'Plot3D/569965_0-70.dat'} {'Plot3D/569965_0-71.dat'} {'Plot3D/569965_0-72.dat'} {'Plot3D/569965_0-73.dat'} {'Plot3D/569965_0-74.dat'} {'Plot3D/569965_0-75.dat'} {'Plot3D/569965_0-76.dat'} {'Plot3D/569965_0-77.dat'} {'Plot3D/569965_0-78.dat'} {'Plot3D/569965_0-79.dat'} {'Plot3D/569965_0-8.dat'} {'Plot3D/569965_0-80.dat'} {'Plot3D/569965_0-81.dat'} {'Plot3D/569965_0-82.dat'} {'Plot3D/569965_0-83.dat'} {'Plot3D/569965_0-84.dat'} {'Plot3D/569965_0-85.dat'} {'Plot3D/569965_0-86.dat'} {'Plot3D/569965_0-87.dat'} {'Plot3D/569965_0-88.dat'} {'Plot3D/569965_0-89.dat'} {'Plot3D/569965_0-9.dat'} {'Plot3D/569965_0-90.dat'} {'Plot3D/569965_0-91.dat'} {'Plot3D/569965_0-92.dat'} {'Plot3D/569965_0-93.dat'} {'Plot3D/569965_0-94.dat'} {'Plot3D/569965_0-95.dat'} {'Plot3D/569965_0-96.dat'} {'Plot3D/569965_0-97.dat'} {'Plot3D/569965_0-98.dat'} {'Plot3D/569965_0-99.dat'}
x = readmatrix(Uz{1}, 'Range','A:A')
x = 1432×1
2.4604
2.4967
2.5330
2.5693
2.6056
2.6419
2.6782
2.7145
2.7508
2.7871
ymtx = NaN(numel(x),numel(Uz));
for k = 1:numel(Uz)
ymtx(:,k) = readmatrix(Uz{k}, 'Range','B:B');
end
ymtx
ymtx = 1432×103
1.0e+03 *
1.2665 1.2390 1.2957 1.3295 1.2866 1.2756 1.3268 1.2701 1.2829 1.2226 1.2783 1.2601 1.2372 1.3058 1.2701 1.2336 1.2683 1.3149 1.2665 1.2528 1.2866 1.2747 1.2875 1.2546 1.2372 1.2482 1.3030 1.2144 1.2601 1.2327
1.4501 1.4590 1.5009 1.4444 1.4293 1.4477 1.4837 1.4664 1.4704 1.4638 1.4245 1.4523 1.4647 1.4399 1.4495 1.4558 1.4585 1.4437 1.4214 1.4375 1.4426 1.4605 1.3969 1.4208 1.4349 1.4192 1.4393 1.3960 1.4216 1.4406
1.5363 1.5556 1.5773 1.5481 1.5332 1.5465 1.5618 1.5608 1.5676 1.5171 1.5129 1.5126 1.5346 1.5261 1.5019 1.5353 1.5379 1.5365 1.5386 1.5538 1.5134 1.5041 1.4984 1.5068 1.5035 1.5194 1.5506 1.5214 1.5161 1.5338
1.5478 1.5654 1.5978 1.5399 1.5437 1.5322 1.5942 1.6009 1.5492 1.5622 1.5534 1.5291 1.5382 1.5195 1.5467 1.5613 1.5274 1.5388 1.5266 1.5480 1.5368 1.5309 1.5295 1.5255 1.5020 1.5091 1.5594 1.5322 1.5028 1.5248
1.4311 1.4366 1.4876 1.4550 1.4216 1.4367 1.4829 1.4560 1.4595 1.4462 1.4493 1.4380 1.4247 1.4277 1.4316 1.4370 1.4438 1.4556 1.4439 1.4534 1.4486 1.4815 1.4257 1.4244 1.4333 1.4281 1.4484 1.4249 1.4361 1.4369
1.2854 1.2920 1.3296 1.2637 1.2814 1.2909 1.3275 1.3605 1.3120 1.2900 1.2933 1.2971 1.2904 1.2928 1.2848 1.2823 1.3208 1.2892 1.2776 1.2796 1.2881 1.2830 1.2718 1.2602 1.2691 1.2963 1.2687 1.2730 1.2636 1.2779
1.0883 1.0985 1.1391 1.1115 1.1109 1.0882 1.1312 1.1230 1.1519 1.1412 1.1091 1.1299 1.1354 1.1099 1.1019 1.0860 1.1173 1.1026 1.1176 1.1082 1.1124 1.1322 1.0924 1.1117 1.1133 1.1100 1.0867 1.1197 1.1160 1.1154
0.9009 0.8975 0.9614 0.9353 0.9231 0.9332 0.9357 0.9385 0.9338 0.9446 0.9514 0.9479 0.9511 0.9505 0.9511 0.8918 0.9264 0.9319 0.9417 0.9383 0.9411 0.9382 0.9312 0.9162 0.9311 0.9320 0.8924 0.9365 0.9382 0.9440
0.7658 0.7547 0.8386 0.8016 0.7964 0.8062 0.8311 0.8224 0.8386 0.8390 0.8350 0.8314 0.8377 0.8427 0.8188 0.7682 0.8285 0.8411 0.8219 0.8207 0.8176 0.8246 0.8032 0.8206 0.8204 0.8089 0.7647 0.8138 0.8006 0.7879
0.6761 0.6596 0.7479 0.7089 0.7084 0.7049 0.7126 0.7284 0.7231 0.7455 0.7445 0.7436 0.7518 0.7280 0.7464 0.6505 0.7565 0.7515 0.7362 0.7359 0.7348 0.7378 0.7407 0.7288 0.7355 0.7176 0.6595 0.7250 0.7209 0.7094
figure
surf(ymtx, 'EdgeColor','none')
grid on
xticklabels = string(x);
yt = yticks;
NrYticks = 9; % Choose Any Integer Divisor of '54'
set(gca, 'YTick',linspace(min(yt), max(yt), NrYticks), 'YTickLabel',linspace(0, -54, NrYticks))
xlabel('x')
ylabel('y')
zlabel('z')
view(60,30)

% shading('interp')
Experiment to get different results.
.
10 个评论
This has worked brilliantly, thank you so much, I don't think I would have been able to work this out alone!
As always, my pleasure!
I’m certain you’d have worked it out. It likely would have taken only a bit longer than it did me.
.
Sorry, one last question, how do I edit the x and y values as they don't seem to co-ordinate with the data, e.g. the y axis should go from 0 to ~54
No worries. My apologies for the delay — I was out running errands.
I have edited my Answer to include the y-axis tick values.
No need to apologise, you have been so quick to help!
Thank you so much!
As always, my pleasure!
.
Star Strider
2022-1-11
编辑:Star Strider
2022-1-11
I sort of forgot where we were here (it’s been 4 months) so it took a few minutes to figure this out.
Depending on what the desired result is, there are two ways to do this:
- To simply restrict the plot, use the ylim function (straightforward),
- To select matrix rows that limit the values used in the surf call (as I did here), find the closest matrix row corresponding to the desired result, and plot only those rows.
The code here trims the matrix to the desired values, so that same approach can be used if only those values (limited row range of ‘ymtx’) are needed in other calculations. The ‘ChooseYVal’ value controls where the plot begins.
Uz = unzip('https://www.mathworks.com/matlabcentral/answers/uploaded_files/731649/Plot3D%5B1%5D.zip')
Uz = 1×103 cell array
{'Plot3D/569965_0-0.dat'} {'Plot3D/569965_0-1.dat'} {'Plot3D/569965_0-10.dat'} {'Plot3D/569965_0-100.dat'} {'Plot3D/569965_0-101.dat'} {'Plot3D/569965_0-102.dat'} {'Plot3D/569965_0-11.dat'} {'Plot3D/569965_0-12.dat'} {'Plot3D/569965_0-13.dat'} {'Plot3D/569965_0-14.dat'} {'Plot3D/569965_0-15.dat'} {'Plot3D/569965_0-16.dat'} {'Plot3D/569965_0-17.dat'} {'Plot3D/569965_0-18.dat'} {'Plot3D/569965_0-19.dat'} {'Plot3D/569965_0-2.dat'} {'Plot3D/569965_0-20.dat'} {'Plot3D/569965_0-21.dat'} {'Plot3D/569965_0-22.dat'} {'Plot3D/569965_0-23.dat'} {'Plot3D/569965_0-24.dat'} {'Plot3D/569965_0-25.dat'} {'Plot3D/569965_0-26.dat'} {'Plot3D/569965_0-27.dat'} {'Plot3D/569965_0-28.dat'} {'Plot3D/569965_0-29.dat'} {'Plot3D/569965_0-3.dat'} {'Plot3D/569965_0-30.dat'} {'Plot3D/569965_0-31.dat'} {'Plot3D/569965_0-32.dat'} {'Plot3D/569965_0-33.dat'} {'Plot3D/569965_0-34.dat'} {'Plot3D/569965_0-35.dat'} {'Plot3D/569965_0-36.dat'} {'Plot3D/569965_0-37.dat'} {'Plot3D/569965_0-38.dat'} {'Plot3D/569965_0-39.dat'} {'Plot3D/569965_0-4.dat'} {'Plot3D/569965_0-40.dat'} {'Plot3D/569965_0-41.dat'} {'Plot3D/569965_0-42.dat'} {'Plot3D/569965_0-43.dat'} {'Plot3D/569965_0-44.dat'} {'Plot3D/569965_0-45.dat'} {'Plot3D/569965_0-46.dat'} {'Plot3D/569965_0-47.dat'} {'Plot3D/569965_0-48.dat'} {'Plot3D/569965_0-49.dat'} {'Plot3D/569965_0-5.dat'} {'Plot3D/569965_0-50.dat'} {'Plot3D/569965_0-51.dat'} {'Plot3D/569965_0-52.dat'} {'Plot3D/569965_0-53.dat'} {'Plot3D/569965_0-54.dat'} {'Plot3D/569965_0-55.dat'} {'Plot3D/569965_0-56.dat'} {'Plot3D/569965_0-57.dat'} {'Plot3D/569965_0-58.dat'} {'Plot3D/569965_0-59.dat'} {'Plot3D/569965_0-6.dat'} {'Plot3D/569965_0-60.dat'} {'Plot3D/569965_0-61.dat'} {'Plot3D/569965_0-62.dat'} {'Plot3D/569965_0-63.dat'} {'Plot3D/569965_0-64.dat'} {'Plot3D/569965_0-65.dat'} {'Plot3D/569965_0-66.dat'} {'Plot3D/569965_0-67.dat'} {'Plot3D/569965_0-68.dat'} {'Plot3D/569965_0-69.dat'} {'Plot3D/569965_0-7.dat'} {'Plot3D/569965_0-70.dat'} {'Plot3D/569965_0-71.dat'} {'Plot3D/569965_0-72.dat'} {'Plot3D/569965_0-73.dat'} {'Plot3D/569965_0-74.dat'} {'Plot3D/569965_0-75.dat'} {'Plot3D/569965_0-76.dat'} {'Plot3D/569965_0-77.dat'} {'Plot3D/569965_0-78.dat'} {'Plot3D/569965_0-79.dat'} {'Plot3D/569965_0-8.dat'} {'Plot3D/569965_0-80.dat'} {'Plot3D/569965_0-81.dat'} {'Plot3D/569965_0-82.dat'} {'Plot3D/569965_0-83.dat'} {'Plot3D/569965_0-84.dat'} {'Plot3D/569965_0-85.dat'} {'Plot3D/569965_0-86.dat'} {'Plot3D/569965_0-87.dat'} {'Plot3D/569965_0-88.dat'} {'Plot3D/569965_0-89.dat'} {'Plot3D/569965_0-9.dat'} {'Plot3D/569965_0-90.dat'} {'Plot3D/569965_0-91.dat'} {'Plot3D/569965_0-92.dat'} {'Plot3D/569965_0-93.dat'} {'Plot3D/569965_0-94.dat'} {'Plot3D/569965_0-95.dat'} {'Plot3D/569965_0-96.dat'} {'Plot3D/569965_0-97.dat'} {'Plot3D/569965_0-98.dat'} {'Plot3D/569965_0-99.dat'}
x = readmatrix(Uz{1}, 'Range','A:A')
x = 1432×1
2.4604
2.4967
2.5330
2.5693
2.6056
2.6419
2.6782
2.7145
2.7508
2.7871
ymtx = NaN(numel(x),numel(Uz));
for k = 1:numel(Uz)
ymtx(:,k) = readmatrix(Uz{k}, 'Range','B:B');
end
ymtx
ymtx = 1432×103
1.0e+03 *
1.2665 1.2390 1.2957 1.3295 1.2866 1.2756 1.3268 1.2701 1.2829 1.2226 1.2783 1.2601 1.2372 1.3058 1.2701 1.2336 1.2683 1.3149 1.2665 1.2528 1.2866 1.2747 1.2875 1.2546 1.2372 1.2482 1.3030 1.2144 1.2601 1.2327
1.4501 1.4590 1.5009 1.4444 1.4293 1.4477 1.4837 1.4664 1.4704 1.4638 1.4245 1.4523 1.4647 1.4399 1.4495 1.4558 1.4585 1.4437 1.4214 1.4375 1.4426 1.4605 1.3969 1.4208 1.4349 1.4192 1.4393 1.3960 1.4216 1.4406
1.5363 1.5556 1.5773 1.5481 1.5332 1.5465 1.5618 1.5608 1.5676 1.5171 1.5129 1.5126 1.5346 1.5261 1.5019 1.5353 1.5379 1.5365 1.5386 1.5538 1.5134 1.5041 1.4984 1.5068 1.5035 1.5194 1.5506 1.5214 1.5161 1.5338
1.5478 1.5654 1.5978 1.5399 1.5437 1.5322 1.5942 1.6009 1.5492 1.5622 1.5534 1.5291 1.5382 1.5195 1.5467 1.5613 1.5274 1.5388 1.5266 1.5480 1.5368 1.5309 1.5295 1.5255 1.5020 1.5091 1.5594 1.5322 1.5028 1.5248
1.4311 1.4366 1.4876 1.4550 1.4216 1.4367 1.4829 1.4560 1.4595 1.4462 1.4493 1.4380 1.4247 1.4277 1.4316 1.4370 1.4438 1.4556 1.4439 1.4534 1.4486 1.4815 1.4257 1.4244 1.4333 1.4281 1.4484 1.4249 1.4361 1.4369
1.2854 1.2920 1.3296 1.2637 1.2814 1.2909 1.3275 1.3605 1.3120 1.2900 1.2933 1.2971 1.2904 1.2928 1.2848 1.2823 1.3208 1.2892 1.2776 1.2796 1.2881 1.2830 1.2718 1.2602 1.2691 1.2963 1.2687 1.2730 1.2636 1.2779
1.0883 1.0985 1.1391 1.1115 1.1109 1.0882 1.1312 1.1230 1.1519 1.1412 1.1091 1.1299 1.1354 1.1099 1.1019 1.0860 1.1173 1.1026 1.1176 1.1082 1.1124 1.1322 1.0924 1.1117 1.1133 1.1100 1.0867 1.1197 1.1160 1.1154
0.9009 0.8975 0.9614 0.9353 0.9231 0.9332 0.9357 0.9385 0.9338 0.9446 0.9514 0.9479 0.9511 0.9505 0.9511 0.8918 0.9264 0.9319 0.9417 0.9383 0.9411 0.9382 0.9312 0.9162 0.9311 0.9320 0.8924 0.9365 0.9382 0.9440
0.7658 0.7547 0.8386 0.8016 0.7964 0.8062 0.8311 0.8224 0.8386 0.8390 0.8350 0.8314 0.8377 0.8427 0.8188 0.7682 0.8285 0.8411 0.8219 0.8207 0.8176 0.8246 0.8032 0.8206 0.8204 0.8089 0.7647 0.8138 0.8006 0.7879
0.6761 0.6596 0.7479 0.7089 0.7084 0.7049 0.7126 0.7284 0.7231 0.7455 0.7445 0.7436 0.7518 0.7280 0.7464 0.6505 0.7565 0.7515 0.7362 0.7359 0.7348 0.7378 0.7407 0.7288 0.7355 0.7176 0.6595 0.7250 0.7209 0.7094
figure
surf(ymtx, 'EdgeColor','none')
grid on
xticklabels = string(x);
yt = yticks;
NrYticks = 9; % Choose Any Integer Divisor of '54'
ytixrows = linspace(0, -54, size(ymtx,1)); % Row Coordinates As 'Y-Tick' Values
ChooseYVal = -7.5; % Next Plot Begins Here
rowidx = ceil(interp1(ytixrows, (1:size(ymtx,1)), ChooseYVal)) % Row Index Corresponding To 'ChooseYVal'
rowidx = 200
set(gca, 'YTick',linspace(min(yt), max(yt), NrYticks), 'YTickLabel',linspace(0, -54, NrYticks))
xlabel('x')
ylabel('y')
zlabel('z')
title('Original With All Values Plotted')
view(60,30)

% shading('interp')
figure
surf(ymtx(rowidx:end,:), 'EdgeColor','none') % Uses Values Calculated In Previous Plot Code
grid on
xticklabels = string(x);
yt = yticks;
NrYticks = 9; % Choose Any Integer Divisor of '54'
% ytixrows = linspace(0, -54, size(ymtx,1)) % Row Coordinates As 'Y-Tick' Values
% ChooseYVal = -7.5;
% rowidx = ceil(interp1(ytixrows, (1:size(ymtx,1)), ChooseYVal)) % Row Index Corresponding To 'ChooseYVal'
set(gca, 'YTick',linspace(min(yt), max(yt), NrYticks), 'YTickLabel',linspace(ChooseYVal, -54, NrYticks))
xlabel('x')
ylabel('y')
zlabel('z')
title('Restricted To Values ≤-7.5 Plotted')
view(60,30)

.
Oh wow, thank you so much for such a quick response. As I'm not too familar with the language used at the start, I was struggling on this for quite a while.
As always, my pleasure!
If you have further questions and have problems figuring out how the code works, don’t struggle longer than necessary. Just ask, and I’ll do my best to provide an appropriate solution (or explain the reason a solution isn’t possible).
更多回答(2 个)
KSSV
2021-9-7
Read about surf. This is your function.
Sam
2021-9-7
Thank you for pointing this out, I have edited this!
My data is in three columns, the third column is redundant (errors), but the first and second column are my x and y, respectively.
The z values are in the file title, i.e. 569965_0-2.dat = 569965 (scan name); 0 (line number); 2 (spot/depth number, there are 102 spots for depth, this will be the z I assume)
I have attached one line here in my zip.
类别
在 帮助中心 和 File Exchange 中查找有关 Graphics Object Properties 的更多信息
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!选择网站
选择网站以获取翻译的可用内容,以及查看当地活动和优惠。根据您的位置,我们建议您选择:。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 MathWorks 国家/地区网站并未针对您所在位置的访问进行优化。
美洲
- América Latina (Español)
- Canada (English)
- United States (English)
欧洲
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)
