找回密码
 立即注册
查看: 536|回复: 5

科研论文中用什么软件作图最好?

[复制链接]
发表于 2023-2-4 17:25 | 显示全部楼层 |阅读模式
科研论文中用什么软件作图最好?
发表于 2023-2-4 17:29 | 显示全部楼层
演示如何用 Matlab 绘制常见的高质量论文插图;
2022-3-13,更新绘图案例
先睹为快















  • 二维曲线图
  • 二维散点图
  • 二维渐变色图
  • 二维条形图
  • 二维填充图
  • 多 Y 轴图
  • 二维场图
  • 带箭头曲线图
  • 三维曲线图
  • 三维散点图
  • 伪彩图
  • 裁剪伪彩图
  • 等高线图
  • 等高线填充图
  • 矢量场图
  • 伪彩图+投影图
  • 条形分布图
  • 热图
  • 分子模型图
  • 分形图
  • 曲线斜线填充
  • 曲面贴图
  • 自定义颜色图
  • gif 动态图
  • 方程曲线图
  • 极坐标图
  • 不相交随机圆
  • BP 神经网络图
  • 小圆构成的圆环
  • 棋盘格
二维曲线

二维曲线算是最最常见的一种曲线了,它能反应两个变量的因果关系;
clear;clc;close all;
x = linspace(1, 200, 100);
y1 = log(x) + 1;
y2 = log(x) + 2;
figure;
plot(x, y1);
hold on
plot(x, y2, 'LineWidth', 2);
hold off
legend('y1', 'y2');

调整线的粗细,给人感觉就不一样;
或者说这个颜色可能你觉得不好看,查阅帮助文档里给的的标准颜色也都不喜欢;


没关系,我整理了 28 种个人觉得比较好看的颜色,自行做一下颜色搭配,一般够用了;
【061 Matlab 基础】推荐28种超好看的淡色figure;
plot(x, y1, 'LineWidth', 2, 'Color', [0.21, 0.21, 0.67]);
hold on
plot(x, y2, 'LineWidth', 2, 'Color', [0.99, 0.49, 0.00]);
hold off
legend('y1', 'y2');

二维散点图

常用来比较理论数据和实验数据的趋势关系;
figure;
y3 = y1 + rand(1, 100) - 0.5;
plot(x, y1, 'LineWidth', 2, 'Color', [0.21, 0.21, 0.67]);
hold on
% 设置数据点的形状、数据点的填充颜色、数据点的轮廓颜色
plot(x, y3, 'o', 'LineWidth', 2, 'Color', [0.46, 0.63, 0.90], 'MarkerFaceColor', [0.35, 0.90, 0.89], 'MarkerEdgeColor', [0.18, 0.62, 0.17]);
hold off

二维渐变色图

用不同的颜色、数据点大小表征不同数值,更加直观;
更详细的案例分析:
【048 绘图】Matlab 绘制渐变色曲线、填充渐变色% 先自己做一个 colormap
c_map =  [0.00, 0.36, 0.67
          0.68, 0.42, 0.89
          0.44, 0.62, 0.98
          0.10, 0.67, 0.59
          0.99, 0.57, 0.59
          0.28, 0.55, 0.86
          0.96, 0.62, 0.24
          0.30, 0.90, 0.56
          0.12, 0.46, 0.71
          0.46, 0.63, 0.90
          0.96, 0.37, 0.40
          0.14, 0.76, 0.71
          0.99, 0.50, 0.02
          0.00, 0.57, 0.76
          0.35, 0.90, 0.89
          0.17, 0.62, 0.47
          0.21, 0.21, 0.67
          0.99, 0.49, 0.00
          0.98, 0.74, 0.44
          0.97, 0.60, 0.58
          0.18, 0.62, 0.17
          0.68, 0.87, 0.53
          0.12, 0.46, 0.70
          0.65, 0.79, 0.89
          0.95, 0.99, 0.69
          0.74, 0.92, 0.68
          0.37, 0.81, 0.72
          0.01, 0.72, 0.77];
scatter(x, y3, x, x, 'filled');
colormap(c_map);

figure;
fill([x, NaN], [y2, NaN], [x, NaN], 'EdgeColor', 'interp', 'LineWidth', 2);

条形图

正常条形图没啥好说的,这里演示绘制带有误差线的柱状图:
figure;
m = 5;
n = 3;
x = 1:m;
y = rand(m, n) + 2;
% 误差限
neg = rand(m, n);
pos = rand(m, n);
% 绘制柱状图
h = bar(x, y);
% 设置三个系列颜色
h(1, 1).FaceColor = [0.00, 0.36, 0.67];
h(1, 2).FaceColor = [0.68, 0.42, 0.89];
h(1, 3).FaceColor = [0.44, 0.62, 0.98];
% 单独设置第二个系列第二个柱子颜色
h(1, 2).FaceColor = 'flat';
h(1, 2).CData(2,:) = [0.21, 0.21, 0.67];
% 获取误差线 x 值
xx = zeros(m, n);
for i = 1 : n
    xx(:, i) = h(1, i).XEndPoints';
end
% 绘制误差线
hold on
errorbar(xx, y, neg, pos, 'LineStyle', 'none', 'Color', 'm', 'LineWidth', 1.5);
hold off
% 绘制图例
legend({'A1', 'A2', 'A3'});
% 设置 x 轴标签
set(gca, 'XTickLabel', {'label1', 'label2', 'label3', 'label4', 'label5'});

填充图

x = 0.4:0.1:2*pi;
y1 = sin(2*x);
y2 = sin(x);
% 确定 y1 和 y2 的上下边界
maxY = max([y1; y2]);
minY = min([y1; y2]);
% 确定填充多边形,按照顺时针方向来确定点
% fliplr 实现左右翻转
xFill = [x, fliplr(x)];
yFill = [maxY, fliplr(minY)];
figure
fill(xFill, yFill, [0.21, 0.21, 0.67]);
hold on
% 绘制轮廓线
plot(x, y1, 'k', 'LineWidth', 2)
plot(x, y2, 'k', 'LineWidth', 2)
hold off

% 函数交叉区域填充
figure;
% 这是三个方程
g1 = @(x,y) 1 - x.^2.*y/20;
g2 = @(x, y) 1 - (x+y-5).^2/30 - (x-y-12).^2/120;
g3 = @(x, y) 1 - 80./(x.^2 + 8*y + 5);
% 把他们的图像画出来
h1 = fimplicit(g1, [0, 10], 'LineWidth', 2);
hold on
h2 = fimplicit(g2, [0, 10], 'LineWidth', 2);
h3 = fimplicit(g3, [0, 10], 'LineWidth', 2);
legend('g1', 'g2', 'g3');
% 问题来了,这个 y 值怎么确定
x1 = h1.XData;
y1 = h1.YData;
x2 = h2.XData;
y2 = h2.YData;
x3 = h3.XData;
y3 = h3.YData;
% 发现 x1, x2 是从大到小的,逆序搞一下
x1 = fliplr(x1);
x2 = fliplr(x2);
y1 = fliplr(y1);
y2 = fliplr(y2);
% 接下来,确定相交区域,主要看这三个关键点:g1-g2, g1-g3, g2-g3
% 数据长度不一样,难搞了,借助【数据提示】功能吧
pt1 = [3.11069, 2.06667];
pt2 = [8.53623, 0.266667];
pt3 = [7.7847, 1.8];
% 确定三个范围
idx1 = find(x1 >= pt1(1) & x1 < pt2(1));
idx2 = find(x2 >= pt1(1) & x2 < pt3(1));
idx3 = find(x3 >= pt3(1) & x3 < pt2(1));
x1 = x1(idx1);
x2 = x2(idx2);
x3 = x3(idx3);
y1 = y1(idx1);
y2 = y2(idx2);
y3 = y3(idx3);
% 一定要是一个闭环
xFill = [x1, fliplr(x3), fliplr(x2)];
yFill = [y1, fliplr(y3), fliplr(y2)];
fill(xFill, yFill, [0.21, 0.21, 0.67]);
hold off

多 Y 轴图

figure;
load('accidents.mat','hwydata')
ind = 1:51;
drivers = hwydata(:,5);
yyaxis left
scatter(ind, drivers, 'LineWidth', 2);
title('Highway Data');
xlabel('States');
ylabel('Licensed Drivers (thousands)');
pop = hwydata(:,7);
yyaxis right
scatter(ind, pop, 'LineWidth', 2);
ylabel('Vehicle Miles Traveled (millions)');

figure;
x = linspace(0,10);
y1 = 2*sin(3*x);
y2 = sin(3*x).*exp(0.5*x);
%% 三个纵坐标演示,更多纵坐标可以按照此方法类推
y3 = 10*cos(3*x);
% 控制 aies 的大小和位置,注意是相对于figure的,范围为[0, 1]
% 三条线绘制到一起,注意数据都标准化到 y1 范围
maxY1 = max(y1);
maxY2 = max(y2);
maxY3 = max(y3);
minY1 = min(y1);
minY2 = min(y2);
minY3 = min(y3);
newY2 = (y2 - minY2)/(maxY2 - minY2);   % 归一化
newY2 = newY2*(maxY1 - minY1) + minY1;  % 反归一化
newY3 = (y3 - minY3)/(maxY3 - minY3);
newY3 = newY3*(maxY1 - minY1) + minY1;
% 画线
axes('position', [0.1 0.1 0.5 0.5]);   
plot(x, y1, 'k', x, newY2, 'r', x, newY3, 'ob--')
ylabel('line1');
% 绘制另外两个空的坐标轴
h2 = axes('position', [0.65 0.1 0.005 0.5]);
% 重复绘制,曲线颜色用白色,和figure背景色一致,看不出来即可
plot(x, y2, 'w')
% 颜色,位置,曲线标签
set(h2, 'ycolor', 'r', 'yaxislocation', 'right', 'xtick', [])
% 不知道为啥2018B版本边界显示不清楚,所以画一条线
hold on
limX2 = get(h2, 'Xlim');
limY2 = get(h2, 'Ylim');
plot([limX2(2), limX2(2)], limY2, 'r');
hold off
% 取消边框
box off
ylabel('line2');
%
h3 = axes('position', [0.75 0.1 0.005 0.5]);
plot(x, y3, 'w')
set(h3, 'ycolor', 'b', 'yaxislocation', 'right', 'xtick', [])
hold on
limX3 = get(h3, 'Xlim');
limY3 = get(h3, 'Ylim');
plot([limX3(2), limX3(2)], limY3, 'b');
hold off
box off
ylabel('line3');
% 取消坐标轴的颜色,和figure统一
% set(h1, 'color','none')
% set(h2, 'color','none')
% set(h3, 'color','none')
% figure背景设置成白色
set(gcf,'color','white');

二维场图

% 直接把 streamline 函数的帮助文档 demo 拷贝过来
[x, y] = meshgrid(0:0.1:1, 0:0.1:1);
u = x;
v = -y;
startx = 0.1:0.1:0.9;
starty = ones(size(startx));
% 需要获取所有流线的属性
figure;
quiver(x, y, u, v);
streamline(x, y, u, v, startx, starty);

带箭头曲线

% 直接把 streamline 函数的帮助文档 demo 拷贝过来
figure;
[x, y] = meshgrid(0:0.1:1, 0:0.1:1);
u = x;
v = -y;
startx = 0.1:0.1:0.9;
starty = ones(size(startx));
% 需要获取所有流线的属性
lines = streamline(x, y, u, v, startx, starty);
% 下面开始画箭头,涉及到坐标的转换
% 获取 Axes 位置
posAxes = get(gca, 'Position');
posX = posAxes(1);
posY = posAxes(2);
width = posAxes(3);
height = posAxes(4);
% 获取 Axes 范围
limX = get(gca, 'Xlim');
limY = get(gca, 'Ylim');
minX = limX(1);
maxX = limX(2);
minY = limY(1);
maxY = limY(2);
% 遍历,逐条流线加箭头
for i = 1 : length(lines)
    % 获取每条流线的数据
    xData = lines(i).XData;
    yData = lines(i).YData;
    % 这里取的是最后两个点,一定要是相邻的两个点用来确定箭头方向
    x0 = xData(end-1 : end);
    y0 = yData(end-1 : end);
    % 转换坐标到相对于figure的坐标
    xNew = posX + (x0 - minX) / (maxX - minX) * width;
    yNew = posY + (y0 - minY) / (maxY - minY) * height;
    % 画箭头
    hold on
    annotation('arrow', xNew, yNew, 'color', 'b');
end
hold off
title('带箭头的流线图');

三维曲线图

figure;
t = 0:pi/20:10*pi;
xt = sin(t);
yt = cos(t);
plot3(xt, yt, t, '-o', 'Color', 'b', 'MarkerSize', 10, 'MarkerFaceColor', '#D9FFFF');

figure;
x = -20:10:20;
y = 0:100;
% 随便生成的 5 组数据,也就是目标图上的 5 条曲线数据
z = zeros(5, 101);
z(1, 1:10:end) = linspace(1, 10, 11);
z(2, 1:10:end) = linspace(1, 20, 11);
z(3, 1:10:end) = linspace(1, 5, 11);
z(4, 5:10:end) = linspace(1, 10, 10);
z(5, 80:2:end) = linspace(1, 5, 11);
for i = 1:5
    % x 方向每条曲线都是一个值,重复 y 的长度这么多次
    xx = x(i)*ones(1, 101);
    % z 方向的值,每次取一条
    zz = z(i, :);
    % plot3 在 xyz 空间绘制曲线,保证 x y z 长度一致即可
    plot3(xx, y, zz, 'LineWidth', 2);
    hold on
end
hold off
legend('line1', 'line2', 'line3', 'line4', 'line5');

% 如果把渐变曲线和三维曲线结合起来
figure;
x = linspace(0, 2*pi, 50);
y = sin(x);
fill3([ones(size(x)), NaN], [x, NaN], [y, NaN], [x NaN], 'EdgeColor', 'interp', 'LineWidth', 2)
hold on
for i = 2 : 5
    if mod(i, 2) == 0
        y = sin(2*x);
        fill3([i * ones(size(x)), NaN], [x, NaN], [y, NaN], [x NaN], 'EdgeColor', 'interp', 'LineWidth', 2)
    else
        y = sin(10*x);
        fill3([i * ones(size(x)), NaN], [x, NaN], [y, NaN], [x NaN], 'EdgeColor', 'interp', 'LineWidth', 2)
    end
end
hold off

三维散点图

figure;
[X,Y,Z] = sphere(16);
x = [0.5*X(:); 0.75*X(:); X(:)];
y = [0.5*Y(:); 0.75*Y(:); Y(:)];
z = [0.5*Z(:); 0.75*Z(:); Z(:)];
S = repmat([70, 50, 20],numel(X), 1);
C = repmat([1, 2, 3], numel(X), 1);
s = S(:);
c = C(:);
h = scatter3(x, y, z, s, c);
h.MarkerFaceColor = [0 0.5 0.5];

x = linspace(1, 200, 100);
y1 = log(x) + 1;
y2 = log(x) + 2;
y3 = y1 + rand(1, 100) - 0.5;
figure;
scatter3(x, y2, y3, x, x, 'filled');
colormap(c_map);

三维伪彩图

[x, y, z] = peaks(30);
figure;
plot1 = subplot(1,2,1);
surf(x, y, z);
% 获取第一幅图的 colormap,默认为 parula
cMap = colormap;
plot2 = subplot(1,2,2);
surf(x, y, z);
% 下面设置的是第二幅图的颜色,默认是整个 figure 的
colormap(hot);
% 设置第一幅图颜色显示为 parula
set(plot1, 'Colormap', cMap);

% 一个坐标轴
figure;
h1 = surf(x, y, z);
freezeColors;
hold on
h2 = surf(x, y, z + 5);
hold off
colormap(hot);

裁剪伪彩图

figure;
n = 300;
[x, y, z] = peaks(n);
subplot(2, 2, [1,3])
surf(x, y, z);
shading interp
view(0, 90)
for i = 1:n
    for j = 1:n
        if x(i, j)^2 + 2 * y(i, j)^2 > 6 && 2 * x(i, j)^2 + y(i, j)^2 < 6
            z(i, j) = NaN;
        end
    end
end
subplot(2, 2, 2)
surf(x, y, z);
shading interp
view(0, 90)
subplot(2, 2, 4)
surf(x, y, z);
shading interp

等高线图

figure;
[X, Y, Z] = peaks;
subplot(2, 2, 1);
contour(X, Y, Z, 20, 'LineWidth', 2);
subplot(2, 2, 2);
contour(X, Y, Z, '--', 'LineWidth', 2)
subplot(2, 2, 3);
v = [1, 1];
contour(X, Y, Z, v, 'LineWidth', 2);
x = -2:0.2:2;
y = -2:0.2:3;
[X, Y] = meshgrid(x, y);
Z = X.*exp(-X.^2-Y.^2);
subplot(2, 2, 4);
contour(X, Y, Z, 'ShowText','on', 'LineWidth', 2);

figure('Position', [0, 0, 900, 400]);
subplot(1, 3, 1);
[X, Y, Z] = sphere(50);
contour3(X, Y, Z, 'LineWidth', 2);
[X, Y] = meshgrid(-2:0.25:2);
Z = X.*exp(-X.^2-Y.^2);
subplot(1, 3, 2);
contour3(X, Y, Z, [-0.2 -0.1 0.1 0.2], 'ShowText', 'on', 'LineWidth', 2)
[X, Y, Z] = peaks;
subplot(1, 3, 3);
contour3(X, Y, Z, [2 2], 'LineWidth', 2);

等高线填充图

figure;
subplot(2, 2, 1);
[X, Y, Z] = peaks(50);
contourf(X, Y, Z);
subplot(2, 2, 2);
contourf(X, Y, Z,'--');
% 限定范围
subplot(2, 2, 3);
contourf(X, Y, Z, [2 3], 'ShowText', 'on');
subplot(2, 2, 4);
contourf(X, Y, Z,[2 2]);

三维矢量场图

figure;
[X, Y, Z] = peaks(30);
% 矢量场,曲面法线
[U, V, W] = surfnorm(X, Y, Z);   
% 箭头长度、颜色
quiver3(X, Y, Z, U, V, W, 0.5, 'r');     
hold on
surf(X,Y,Z);  
xlim([-3, 3]);
ylim([-3, 3.2]);
shading interp
hold off
view(0, 90);

伪彩图+投影图

clear;clc;close all;
x = linspace(-3, 3, 30);
y = linspace(-4, 4, 40);
[X, Y] = meshgrid(x, y);
Z = peaks(X, Y);
Z(5:10, 15:20) = 0;
z1 = max(Z);
z2 = max(Z, [], 2);
figure;
subplot(3, 3, [1, 2]);
plot(x, z1, 'LineWidth', 2);
subplot(3, 3, [6, 9]);
plot(z2, y, 'LineWidth', 2);
subplot(3, 3, [4, 5, 7, 8]);
surf(x, y, Z);
xlim([-3, 3]);
ylim([-4, 4]);
view(0, 90);
shading interp

figure;
% 3*3 布局
tiledlayout(3, 3, 'TileSpacing', 'Compact');
% 占据 1*2,也就是 1 2
nexttile([1, 2]);
plot(x, z1, 'LineWidth', 2);
% 从第 6 个开始,占据 2*1,也就是 6 和 9
nexttile(6, [2, 1]);
plot(z2, y, 'LineWidth', 2);
% 从第 4 个开始,占据 2*2,也就是 4 5 7 8
nexttile(4, [2, 2]);
surf(x, y, Z);
xlim([-3, 3]);
ylim([-4, 4]);
view(0, 90);
shading interp

条形分布图

clear;clc;
x = linspace(-10, 10, 100);
y = gauss(100, 5) ;
figure;
% 设置边缘颜色和宽度
bar(x, y, 'EdgeColor', 'none', 'BarWidth', 1);

热图

clear;clc;
z = rand(50);
z(z >= 0.0 & z < 0.6) = 0.5;
z(z >= 0.6 & z < 0.8) = 0.7;
z(z >= 0.8 & z <= 1) = 0.9;

for i = 1:30
    z(randi(50, 1, 1) : end, i) = nan;
end
for i = 31:50
    z(30 + randi(20, 1, 1) : end, i) = nan;
end
z(20:25, 40:45) = nan;
figure;
% ax = surf(z);
ax = pcolor(z);
view(0, 90);
ax.EdgeColor = [1 1 1];
axis off

figure;
for i = 1:50
    for j = 1:50
        if ~isnan(z(i, j))
            x = [i - 1, i, i, i - 1];
            y = [j - 1, j - 1, j, j];
            c1 = 'w';
            c2 = 'w';
            if z(i, j) >= 0.1
                c1 = 'black';
                c2 = [0.65, 0.78, 0.56];
                if z(i, j) >= 0.6
                    c2 = [0.98, 0.46, 0.23];
                    if z(i, j) >= 0.8
                        c2 = [0.99, 0.02, 0.02];
                    end
                end
            end
            patch(x, y, c2, 'EdgeColor', c1);
        end
    end
end
axis off

分子模型图

clear;clc;
% 球面的坐标信息,为了看起来平滑一点,给到 100
[x, y, z] = sphere(100);
% C 大小
C = 10;
% H 大小
H = 5;
figure;
% 大球
surf(C*x, C*y, C*z, 'FaceColor', 'red', 'EdgeColor', 'none')
hold on
% 四个小球,都偏离一点位置,准确的位置需要计算,这里演示一个大概位置
surf(H*x, H*y, H*z + 10, 'FaceColor', 'blue', 'EdgeColor', 'none');
surf(H*x + 10, H*y, H*z - 3, 'FaceColor', 'blue', 'EdgeColor', 'none');
surf(H*x - 4, H*y - 10, H*z - 3, 'FaceColor', 'blue', 'EdgeColor', 'none');
surf(H*x - 4, H*y + 10, H*z - 3, 'FaceColor', 'blue', 'EdgeColor', 'none');
% 坐标轴设置
axis equal off
% 光源,看起来更有立体感
light
lighting gouraud

分形图

clear;clc;
n = 1000;
m = 1000;
f = @(z) z^8 - 1;
df = @(z) 8*z^7;
[X, Y] = meshgrid(linspace(-2, 2, n), linspace(-2, 2, m));
A = nan(n, m);
for i = 1:n
    for j = 1:m
        z0 = X(i, j) + 1i*Y(i, j);
        % Newton-Raphson
        z = z0;
        ite = 0;
        fz = f(z);
        while abs(fz) > 1e-6 && ite < 20
            z = z - f(z)/df(z);
            fz = f(z);
            ite = ite + 1;
        end
        A(i, j) = ite;
    end
end
figure;
pcolor(X, Y, A);
% hold on
% plot([1, -1, 0, 0], [0, 0, 1, -1], '.k', 'MarkerSize', 20);
% hold off
shading flat
axis tight manual

% xlim([-0.5, 0]);
% ylim([0.5, 1]);
% 保存成视频
% set(gca, 'nextplot', 'replacechildren');
% v = VideoWriter('NRfractal.avi');
% open(v);
% for k = 1:20
%     pcolor(X, Y, A);
%     shading flat
%     xlim([-2*(1-k/25), 2*(1-k/25)]);
%     ylim([-2*(1-k/25), 2*(1-k/25)]);
%     frame = getframe(gcf);
%     writeVideo(v, frame);
% end

% (-0.19, 0.6557)
% (-0.1, 0.651)
% zx = zx*zx - zy*zy + cx
% zy = 2*zx*zy+cy
c = - 0.1 + 1i*0.651;
radius = 32;
[X, Y] = meshgrid(linspace(-1.5, 1.5, n), linspace(-1.5, 1.5, m));
A = nan(n, m);
for i = 1:n
    for j = 1:m
        z = X(i, j) + 1i*Y(i, j);
        % Julia
        for ite = 1:1000
            z = (z*z + c) ;
            if abs(z) > radius
                break;
            end
        end
        A(i, j) = ite;
    end
end
figure;
pcolor(X, Y, A);
shading flat
axis tight manual

曲线斜线填充

【058 基础】用 Matlab 绘制带有X轴和Y轴箭头以及斜线填充的曲线图曲面贴图

clear;clc;
figure;
% 读取地图文件
image = imread('World.jpg');
% 生成一个球面数据
[x, y, z] = sphere(200);
% 绘制球体
p = surf(x, y, z);
% 去网格线
shading interp;
p.CData = image;
% 纹理贴图
p.FaceColor = "texturemap";
axis equal;
axis off
% 光源,看起来更有立体感
% light
% lighting gouraud
% 光源颜色
handle = light('Color', [1 1 1]);
t = 0;
while t < 100
    t = t + 1;
    view([t 10]);
    lightangle(handle, t, 0);
    pause(0.01);
end

自定义颜色图

clear;clc;
N = 500;
z = peaks(N);
% 选择 ROI 以外的不显示
for i = 1:N
    for j = 1:N
        if sqrt((i - N/2)*(i - N/2) + (j - N/2)*(j - N/2)) > 240
            z(i, j) = nan;
        end
    end
end
% 自定义颜色 大概就是给特定范围值指定颜色
N = 14 * 5;
crange = linspace(-6, 8, N);
cmap = zeros(N, 3);
for i = 1:N
    if crange(i) <= 0
        cmap(i, :) = [0, 1, 0];
    elseif crange(i) <= 3
        cmap(i, :) = [0, 0, 1];
    elseif crange(i) <= 6
        cmap(i, :) = [1, 1, 0];
    else
        cmap(i, :) = [1, 0, 0];
    end
end
figure;
surf(z)
colormap(cmap);
% 去网格
shading interp
% 视角
view(0, 90);
% 去坐标轴
axis off

gif 动态图

clear; clc;
x = 0:0.01:1;
n = 1:9;
len = length(n);
im = cell(1, len);
% 单独显示每个图
figure;
for idx = 1:len
    subplot(3, 3, idx)
    plot(x, x.^idx, 'LineWidth',3)
    title(['y = x^', num2str(idx)])
end
% 获取绘制对象
fig = figure(1);
for idx = 1:len
    y = x.^idx;
    plot(x, y, 'LineWidth', 3)
    title(['y = x^', num2str(n(idx))])
%     drawnow
%     pause(0.1);
    frame = getframe(fig);
    im{idx} = frame2im(frame);
end
% 输出文件名
% filename = 'testAnimated.gif';
% for idx = 1:len
%     % 制作gif文件,图像必须是index索引图像
%     [A, map] = rgb2ind(im{idx}, 256);
%     if idx == 1
%         imwrite(A, map, filename, 'gif', 'LoopCount', Inf, 'DelayTime', 0.3);
%     else
%         imwrite(A, map, filename, 'gif', 'WriteMode', 'append', 'DelayTime', 0.3);
%     end
% end

方程曲线图

% 二元方程  x^2*cos(y) + x*sinh(y^2) = 0
xy = linspace(-2, 2, 4);
f = @(x, y) x.^2.*cos(y) + x.*sinh(y.^2);
figure
fimplicit(f, [-2, 2]);

【027】函数可视化极坐标图

figure;
theta = 0:0.01:2*pi;
rho = sin(2*theta).*cos(2*theta);
tiledlayout(1, 2);
nexttile;
polarplot(theta, rho, 'c', 'LineWidth', 2);
nexttile;
rMax = 2*max(rho);
% 这个看不到线,因为只有一个重复的点
polarplot([0, 2*pi], [rMax, rMax]);   
hold on
polarplot(theta, rho, 'm', 'LineWidth', 2);
hold off

不相交随机圆

clear;clc;close all;
% 限定范围
width = 10;  
height = 10;
% 最多产生的圆的个数
circleNumber = 100;   
% 记录每个圆的横坐标、纵坐标、半径
paras = zeros(circleNumber, 3);  
num = 0;
hold on
while num < circleNumber
    num = num + 1;   
    % 圆半径小于1或者设定为固定值
    r = rand;
    % 在范围内随机坐标
    xPos = rand*(width-2*r) + r;  
    yPos = rand*(height-2*r) + r;
    % 记录坐标、半径
    paras(num,:) = [xPos, yPos, r];
    % 判断每个圆的位置是否不相切、不相交
    if num > 1
        % 新产生的圆和之前产生的所有圆计算距离        
        xs = paras(1:num - 1, 1);
        ys = paras(1:num - 1, 2);
        rs = paras(1:num - 1, 3);
        dist1 = sqrt((xPos - xs).^2 + (yPos - ys).^2);
        dist2 = abs(r + rs);
        % 如果相离则绘制当前产生的圆,否则就重新生成一个圆
        if all(dist1 > dist2)
            rectangle('Position', [xPos-r, yPos-r, 2*r, 2*r], 'Curvature', [1 1]);
            axis equal
        else
            r = rand;
            xPos = rand*(width-2*r) + r;  
            yPos = rand*(height-2*r) + r;
            paras(num,:) = [xPos,yPos,r];
            % 防止死循环
            temp = 0;
            maxTry = 100;
            while any(dist1 <= dist2) && temp < maxTry
                temp = temp + 1;
                dist1 = sqrt((xPos - xs).^2 + (yPos - ys).^2);
                dist2 = abs(r + rs);
            end
            if all(dist1 > dist2)
                rectangle('Position', [xPos-r, yPos-r, 2*r, 2*r], 'Curvature', [1 1]);
                axis equal
            end
        end      
    end
end
axis([0 width 0 height])
box on
hold off

BP 神经网络图

figure;
x1 = ones(1, 5);
x2 = 2 * ones(1, 11);
x3 = 3 * ones(1, 8);
y1 = 4:8;
y2 = 1:11;
y3 = 2.5:9.5;
for i = 1:5
    for j = 1:11
        plot([x1(i), x2(j)], [y1(i), y2(j)], 'k');
        hold on
    end
end
for i = 1:11
    for j = 1:8
        plot([x2(i), x3(j)], [y2(i), y3(j)], 'k');
    end
end
scatter(x1, y1, 200, 'k', 'MarkerFaceColor', 'r');
scatter(x2, y2, 200, 'k', 'MarkerFaceColor', 'y');
scatter(x3, y3, 200, 'k', 'MarkerFaceColor', 'k');
plot([1.5, 1.5], [0, 11], 'k--');
plot([2.5, 2.5], [0, 11], 'k--');
hold off
axis off
text(1.5, 11.75, '输入层');
text(2, 11.75, '隐藏层');
text(2.5, 11.75, '输出层');

小圆构成的圆环

clear;clc;
x0 = 0;
y0 = 0;
r1 = 2;
r2 = 1;
theta = 0:pi/50:2*pi;
for i = 1:length(theta)
    % 系列小圆的圆心坐标 极坐标方式
    x = x0 + r1 * cos(theta(i));
    y = y0 + r1 * sin(theta(i));
    % 以小圆圆心画圆 极坐标方式
    xx = x + r2 * cos(theta);
    yy = y + r2 * sin(theta);
    plot(xx, yy, 'k');
    hold on
end
hold off
% 限定显示范围
xlim([-3, 3]);
ylim([-3, 3]);
% x y 轴等宽
axis equal
% 紧凑
axis tight

棋盘格

figure;
% 生成数据点
[x, y] = meshgrid(30:39);
x = x(:);
y = y(:);
scatter(x, y, 100, 'red');
hold on
% 随机填充几个点
number = 5;
index_x = randi(9, 1, number) + 30;
index_y = randi(9, 1, number) + 30;
scatter(index_x, index_y, 100, 'blue', 'MarkerFaceColor', 'blue');
hold off
% 显示网格
grid on
% 网格属性
set(gca, 'GridAlpha', 1, 'GridColor', [0 0 0], 'GridLineStyle', '--');

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
 楼主| 发表于 2023-2-4 17:38 | 显示全部楼层
墙裂推荐我自己!!
如果需要绘制化学结构式、反应机理,一定要试试“KingDraw”专业化学绘图的国产软件,中文界面、没有广告弹窗、功能丰富,并且 完!全!免!费!



下载地址:www.kingdraw.com

丨免费、专业、多客户端、无版权困扰

KingDraw,是一款自主研发的国产化学绘图软件,安装简便,支持中文界面,兼容cdx、mol v2000、mol v3000等多种文件格式,并且拥有手机、平板、电脑多个客户端。绘图过程简单易上手,新手也可以随时轻松绘制化学结构式,记录反应流程。
KingDraw支持ACS 1996绘图模式,也根据需要自定义设置绘图模板,支持导出EMF、SVG、PNG格式图片,可以用于专业图像处理,以及出版物的编辑。
最重要的是,KingDraw是免费软件,与其它破解版软件相比,用KingDraw绘制图片没有任何版权困扰!
丨支持与Microsoft Office、WPS Office、ChemDraw的互通

KingDraw PC端支持与Microsoft Office、WPS Office、ChemDraw的互通,只要简单地复制粘贴,就可以将绘制内容复制到ChemDraw、Word、PowerPoint、WPS等文件中。
双击Microsoft Office、WPS Office文件内的结构式,可以二次编辑修改。轻松搞定你的论文配图~
KingDraw:如何将结构式复制到Word、PowerPoint等软件中13 赞同 · 4 评论文章13 赞同 · 4 评论文章13 赞同 · 4 评论文章13 赞同 · 4 评论文章13 赞同 · 4 评论文章13 赞同 · 4 评论文章14 赞同 · 4 评论文章14 赞同 · 4 评论文章KingDraw:KingDraw与ChemDraw互通升级!Word中的ChemDraw文件也能编辑~33 赞同 · 6 评论文章33 赞同 · 6 评论文章33 赞同 · 6 评论文章34 赞同 · 7 评论文章37 赞同 · 7 评论文章38 赞同 · 10 评论文章38 赞同 · 9 评论文章38 赞同 · 9 评论文章
丨功能丰富,适用于教学、科研多种场景

除了丰富的绘图功能,KingDraw还支持结构式图像识别、智能手势绘制、3D模型转换、结构式命名、化学属性计算、<a href="http://link.zhihu.com/?target=http%3A//baike.kingdraw.com/" class=" wrap external" target="_blank" rel="nofollow noreferrer">化合物信息查询(化合物百科)等多种功能,适用于日常工作学习、科研工作、教学活动等多种场景。



KingDraw PC:图像识别



KingDraw PC:化学属性计算



KingDraw PC:3D模型转换

丨下载地址:http://www.kingdraw.com

有兴趣的同学可以KingDraw官网【http://www.kingdraw.com】下载需要的客户端~
如果您有意见或者想要的功能,欢迎随时给我们留言,KingDraw的成长,需要您的声音~~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2023-2-4 17:41 | 显示全部楼层
每个软件的侧重点,和出来的效果都不同呀,没有绝对的好不好~
可以对比看一下哪款软件的出图效果更符合你的需求,同时中和考虑一下每个软件的上手难度进行选择。
本文所有软件资源及教程,我都给大准备好了,有需要的话直接访问领取。免费的~
开门见山,我准备了200G科研绘图资料,囊括所有常见绘图软件,免费送给大家。
一、Adobe AI

AI主要用于绘制各种示意图,三大刊上的精美封面效果都可以通过它来实现。
精美程度:★★★★★
上手难度:★★★★☆
AI的上手难度其实不算高,至少不用写代码,通过面板式操作就可以实现。主要难度来自于对软件基本功能的学习,只要花一周左右时间系统学习下AI的基础操作以及可实现的功能,跟着教程绘制几幅实战图,基本上就可以上手了。
难度天花板在于你要自己要清楚自己想画什么样的图,下面这些图的绘制其实难的都不是技术,主要是自己要有这个设计思维。
本文所介绍的十款软件,我都给大家找到了教程和资源工具包,记得看到文末领取哦~



小肠绒毛绘制



DNA缠绕蛋白



病毒侵染

二、PPT

对,就是你平时用的那个power point,没想到吧,他也能做科研绘图,而且还是做示意图的一把好手!
精美程度:★★★★★
上手难度:★★☆☆☆
相较于AI,PPT的上手难度更小了。很多功能其实都是大家平时接触过的,只是可能你还不知道还能这样做。学习成本属于十款软件中最低的,非常轻便易上手,并且输出的分辨率和图片的专业程度丝毫不输另外的专业软件。



信号通路图绘制



分子结构绘制



叶绿体绘制

三、Adobe PS

精美程度:★★★★★
上手难度:★★★★☆
其实PS和AI两者有很多相通之处,毕竟是都是来自Adobe家的。有什么区别呢?
PS制作的图片是位图,AI制作的图片是矢量图。说简单点,就是PS更侧重于修图,AI更侧重于绘图,拍摄的实验图想经过二次调整,调色/放大/调整清晰度这些操作都更加适合用PS来解决。



区域截取,调整比例



核酸电泳图处理


四、Origin

精美程度:★★★★★
上手难度:★★★☆☆
前面几款更侧重于示意图的绘制,而接下来的包括Origin都更偏向于作图和一些数据分析。
Origin上手难度不算大,可以将它理解为高级版本的excel,导入数据点点鼠标就可以出图。但是想要更加美观,就还是需要点审美能力滴。
提供几个配色网站供大家学习:
1、https://www.materialui.co/colors
2、https://coolors.co/browser/latest/1
3、https://www.materialpalette.com/colors
4、http://www.cookbook-r.com/Graphs/C




平滑三维曲面图




五、Graphpad Prism

精美程度:★★★★★
上手难度:★★☆☆☆
从数据统计到figure的完成,GraphPad Prism可以一条龙服务,几乎可以搞定大部分所需的统计与作图。
它也是面板操作,所以上手难度不高,可以说是十款中最简单的几款了。而且Graphpad自带的图片样式就比较好看,不需要做过多的参数上的调整。看我下面给的图片就能发现,整体上是那种极简主义风格的图片,我比较喜欢~
官方就有教程:Getting Started with Prism



拼图




六、Matlab

精美程度:★★★★★
上手难度:★★★★★
接下来开始进入上手难度魔鬼模式,虽然难度大,但是强也是真的强。操作基于代码进行,听听百度百科怎么说:
MATLAB是美国MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域
厉害吧,专业吧。简单来说,Matlab是一个具有强大计算能力和仿真能力的数学软件。可以用来外理各种数据。统计规律,模拟各种物理模型。比如解方程等这些都可以完成。而且可引入计算机编程运行等。MATLAB内部有现成的一些常用的数值计算方法,例如牛顿法、高斯法等,同时MATLAB也可以进行符号运算,进行符号积分以及微分运算。
在绘图方面,Matlab拥有强大的绘图功能,内置了很多绘图函数,只需要给出一些基本参数就能得到所需图形,这类函数称为高层绘图函数



图源:@王赟 Maigo



图源:@王赟 Maigo




七、Ggpolt

精美程度:★★★★★
上手难度:★★★★★
ggplot是R语言中内置的一个绘图包,所以要写代码无疑了。R语言是一种专门用于统计学领域进行数据分析的一种语法,可以很强大的进行数据处理,而加上ggplot这个包,让R语言的绘图能力直接站上新台阶!
虽然需要代码编写,但是R语言其实也并不算太难。最近我们出了R语言的筑基入门课,0代码经验的小白也能轻松上手。感兴趣的小伙伴可以点击链接学习:
R语言医学统计入门课,免费领!限200名额!
完全免费的,完全免费的,放心入,放心入,学过都说好!








八、Matplotlib

精美程度:★★★★★
上手难度:★★★★★
提到python绘图,那肯定就是Matplotlib了。数据分析方面:R更加小而专(尤其是涉及临床常用的经典的统计方法时); python适用于超大规模数据的计算,前沿算法的实现。
代码的学习,前期都比较痛苦,任何一个需要用代码绘图的软件对于新手来说都不简单。但是坚持学下去的话,得到的收获也不是前面简单的软件可以比拟的。文末我提供的福利包里都有相关教程的学习。








九、Latex

精美程度:★★★★★
上手难度:★★★☆☆
结尾来两款稍微简单点的,恢复一下科研信心。
LaTeX 是一种基于 ΤΕΧ 的排版系统,所以它实现的是纯粹的可视化,而不能进行数据分析。但是就画图而言,他能做的还是挺多的:





https://github.com/HarisIqbal88/PlotNeuralNet

十、Visio

精美程度:★★★★★
上手难度:★★☆☆☆
visio是微软旗下的一款专门用于画流程图的软件,可以用它来绘制项目的进行流程等,但如果应用得当的话,也可以用其中的元素进行更加复杂的示意图的拼接。如下:








以上十款就是在科研绘图中大多数人会选择到的主流绘图软件了,选择任一一款其实就可以满足我们大部分的可视化需求,如果你需要在可视化的同时兼具数据分析的能力,那就选择前八款;如果你需要比较强大的数据分析能力,那就选择第六七八款,基本上专业的数据分析师也就是用他们了。
文章的最后,我给大家找到了一个可以免费领取上述软件资源以及教程,有需要的话直接访问领取。
开门见山,我准备了200G科研绘图资料,囊括所有常见绘图软件,免费送给大家。
<hr/>推荐阅读:
如何制作一张好的学术海报(poster)?为什么你在使用R语言?Toedit:48个国内外文文献下载渠道汇总(附不限量下载入口)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2023-2-4 17:46 | 显示全部楼层
很多人推荐的比较炫酷的绘图软件多半是生物、化学等学科领域的软件,很少有人推荐工程领域需要绘制实物模型、空间模型以及其他图表绘制软件。这里小E来推荐4个容易上手又很强大的绘图软件,让你的科研作图事半功倍。
1、 最易上手的绘制示意图软件:Microsoft Visio
获取网址:https://www.microsoft.com/zh-cn/microsoft-365/visio/flowchart-software/
作为微软办公套装全家桶系列的一员,Visio的名气相较于Word、Excel及PPT实在是小了很多,甚至比起OneNote、Outlook这些软件也略微逊色,但这不妨碍它成为微软最简单、几乎没有任何学习成本的绘图软件。根据官方的描述,它被定义成了一个用于制作流程图表、工作计划安排的辅助性软件。但真正接触使用过之后就知道,这款软件能做的事情远远不止官方定义的那么简单。对于简单的图片处理工作,例如颜色修改、注释添加、图片拆解、图片替换、概念图绘制等等内容,其实它都可以胜任。相较于Photoshop、Illustrator等动辄十几个G,对电脑配置有一定要求,学习成本极高的绘图软件来说,这款软件对小白极为友好,上手简单,效率颇高。例如以下两张图片,就是使用基本底图导入Visio绘制的:





2、 功能强大的图表绘制软件:Origin
获取网址:https://www.originlab.com/
作为科研界使用最广的图表制作软件,Origin几乎适用于所有的科研领域的数据分析和图表绘制,2d图表、3d图表、曲面图、瀑布图、空间坐标几乎所有的图表形式它都能做,尽管有一定的学习成本,但熟悉之后一定会感叹其功能之强大。悄悄提一句,哪怕是CNS(Cell、Nature、Science)中发表的许多论文,其中的图表都是用这款软件绘制的。以下是Origin绘制的一些示意图:








3、 地理信息绘制软件:ArcGis
获取地址:https://developers.arcgis.com/


相信大家对去年美国总统大选各州票数统计地图一定印象深刻,像上面这种可视化地图其实就可以用ArcGis这种地理信息绘制软件做出来。该软件可以通过信息集成+区域分类绘制可视化的地图信息,像上述这种地图就是一个很好的例子。此外,该软件还可以结合Python进行网络数据爬取、集成绘图。尽管有一定的学习成本,但是这款软件可以绘制出非常美观的可视化信息地图来,可以为你的论文增色不少。
4、 实物模型绘制软件:Sketch up/SolidWorks
获取网址:https://www.sketchup.com/ or
对于机械、土木、电气等工科专业的研究生来说,为了更好的说明某个装置的实际尺寸及空间结构,经常需要绘制这个装置设备的概念图、模型图,这个时候这两款软件就能派上用场了。这两款软件可以应用于建筑、施工、地貌测绘、城市信息等等诸多领域,甚至可以通过渲染制作视频特效,功能十分强大,许多高质量论文中的插图都是使用这两款软件进行绘制的。此外,由于这两款软件都是已经比较成熟了的商业软件,学习成本相对较低,可以在短时间内快速上手。同时他们也有丰富的插件助手,可以协助辅助绘图。



如果您担心自己绘制的图片达不到拟投稿期刊的要求,或者想让插图吸引编辑和审稿人的眼球,从而增大自己论文的接收概率,欢迎您了解并使用我们意得辑的图片优化服务。我们会雇佣专业的设计师对您的图片进行格式调整编排,同时还会协助您校对图片和文稿信息的一致性,确保满足对应期刊的投稿要求。意得辑拥有2000+名母语编辑,涵盖1300+门学科,近20年已服务200万+篇稿件。为您提供SCI 投稿指导服务,从文稿翻译、润色到选刊指导,更提供格式排版、投稿信撰写、附信审查等服务,涵盖投稿全过程,可以协助加速您的论文发表。让我们完成繁琐枯燥的论文发表流程,您则可以全身心关注于研究本身!
我是editage意得辑,每日一篇SCI干货,欢迎点赞收藏关注~

  • 润色翻译、发表指导
  • 手把手教你写论文
  • 学术大佬直播
  • 论文写作100个常见错误

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2023-2-4 17:53 | 显示全部楼层
PPT非常值得尝试,尤其对于小白、新手,极度友好!

相比于专业的大型软件,PPT有它自己独特的优势:
既可以做简单的3D建模,也可以画2D矢量图,有海量的免费素材使用,还可以利用PPT自带动画功能快速将静图转为原理动画。最重要的是,PPT入门门槛极低,人人都可以学会。
PPT做的图可以达到什么样的水平?如何学习呢?
我梳理了69篇教程,希望可以帮助到你:
Part 1:PPT科研绘图·新手必读

PPT3D绘图参数详解



论文3D插图从未如此简单:PPT的强大,只被发现了1%



PPT3D基础入门



PPT作图如何满足投稿要求?



投稿必知:论文插图素材版权及免版权图片下载



论文作图素材哪里下载:7个优质网站推荐



Part 2:常用效果&高频元素的制作

综述中环形图的PPT画法



文字圆形环绕和三维倾斜的PPT做法



环形箭头的PPT画法



放大效果的PPT画法



拖尾和反弹效果的PPT画法



快如闪电!PPT中抠图的3种方法



PPT一分钟搞定论文图片排版



图片融合效果的PPT做法



手势的PPT画法



水珠的PPT画法



波浪的PPT画法



搅拌效果的PPT画法



燃烧效果的PPT画法



光芒的PPT画法



光束的PPT画法



光的PPT画法(付费)



云/雾的PPT画法



ThreeD插件动画功能详解



Part 3:常用3D模型的制作

开孔泡沫/多孔结构的PPT画法



水凝胶的PPT画法



一分钟搞定球簇、球壳、胶束、纳米花、病毒



高分子网络的PPT画法



PPT画聚轮烷



图片3D弯曲效果的PPT做法



球棍型DNA的画法



注射器和电极的PPT画法



石墨烯的PPT画法



PPT画掺杂石墨烯



多层结构的PPT画法



骨架结构的PPT画法



水热反应釜(含剖面)的PPT画法



纳米花的另一种PPT画法



AI芯片的PPT画法



显示器和电脑主机的PPT画法



3D环状DNA的PPT画法



碳纳米管3D模型的PPT画法



3D弯曲纤维束结构的PPT画法



3D分子建模及其3D旋转动画(以碳纳米管为例)



空心金属簇3D模型的PPT画法



两种3D纳米微管的PPT画法



投影仪的PPT3D建模



标准正弦曲线的PPT画法



多孔结构的3分钟画法


Part 4:PPT与其他软件的联动

如何在PPT中修改Origin图表并添加动画




如何从图片中提取数据



如何用PPT中编辑他人论文的原图



7个ChemOffice高级技巧,让作图快10倍



科研绘图神器OKPlus插件使用教程



PPT快速绘制函数曲线



绘图硬件选择
你的作图装备,不是只电脑



Part 5:综合运用

期刊封面的设计思路与PPT制作方法



光路图的PPT画法



皮肤组织剖面图的PPT画法



厂房3D模型的PPT画法



Part 6:百尺竿头!跟Nature学画图系列教程
(1) 高质感小球的PPT画法



(2) 简单的图也有很多细节



(3) 褶皱细胞膜的PPT画法



(4) 死亡细胞、噬菌体、酶蛋白的PPT画法



(5) 《Nature》涂刮工艺的画法:一个99.9%的人不知道的作图技巧



(6) 河道地形图的PPT画法



(7) 透明质感树脂的PPT画法



(8)光束和闪电的PPT画法



(9)光电检测图的PPT画法


最后:

全网最全科研绘图素材、资源合集

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 07:25 , Processed in 0.090436 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表