MATLAB | 情人节画个花瓣venn图?

之前七夕节情人节各种花,相册,爱心啥的都快画够了,今年画个花瓣韦恩图?


花瓣上的数字是仅属于该类的样本数,而中心的数字是属于每一类的样本数


教程部分

0 数据准备

matlab 复制代码
% 给组起名t1 t2 t3...t15
setName = compose('t%d', 1:15);

% 随机生成数据
Data = [rand(200, 15) > .1; rand(200, 15) > .85];

% 设置字体
numFont = {'FontSize', 14, 'FontName', 'Times New Roman'};
labFont = {'FontSize', 16, 'FontName', 'Times New Roman'};

其中Data数据是个0-1矩阵,矩阵每一行代表一个样本,如果第n列是1代表该样本属于第n类,是0则代表不属于。


1 配色

matlab 复制代码
CList = lines(15);
% C = flowerPlotColor();
% CList = C.CList631;

这里直接取MATLAB自带的lines配色,当然我也准备了很多其他配色,可以复制下来用:

matlab 复制代码
function C=flowerPlotColor
C.CList1877 = [
    0.2431    0.3294    0.5882
    0.5098    0.5647    0.7333
         0    0.5569    0.8078
    0.3490    0.7804    0.9216
    0.0275    0.4431    0.5294
    0.4157    0.6667    0.7176
    0.0392    0.5647    0.5255
    0.3294    0.7490    0.7176
    0.5569    0.1255    0.2627
    0.7373    0.4784    0.5608
    0.8784    0.3765    0.4941
    0.9255    0.6275    0.6980
    0.9961    0.6275    0.5647
    0.9961    0.8118    0.7804
    0.7216    0.7373    0.7569
    0.8824    0.8863    0.8980];
C.CList1514 = [
    0.4078    0.5647    0.8157
    0.9098    0.7843    0.6588
    0.9725    0.8784    0.7216
    0.9725    0.9725    0.9725
    0.2196    0.3137    0.4392
    0.5333    0.6588    0.9725
         0         0         0
    0.5961    0.5961    0.6902
    0.3451    0.4706    0.5647
    0.8471    0.8471    0.9725
    0.7216    0.7216    0.8157
    0.8157    0.6902    0.5647
    0.7216    0.5961    0.4706
    0.2510    0.4078    0.6275
    0.7216    0.7843    0.9725];
C.CList1596 = [
    0.2549    0.5490    0.9412
    0.9882    0.7059    0.2549
    0.8784    0.2510    0.0392
    0.0196    0.3922    0.5725
    0.7490    0.7490    0.7490
    0.1020    0.2314    0.4118
    1.0000    0.8902    0.5098
    0.0706    0.6118    0.8667
    0.7922    0.4196    0.2941
         0    0.3608    0.8588
    0.9529    0.8235    0.5333
    0.3137    0.3882    0.5059
    0.9451    0.7255    0.6588
    0.8784    0.5137    0.0392
    0.4706    0.5765    0.7451];
C.CList1470 = [
    0.1882    0.4078    0.5961
    0.2824    0.5020    0.6902
    0.9098    0.8157    0.6275
    0.7843    0.6902    0.5020
    0.3765    0.5961    0.7843
    0.1255    0.1882    0.2824
         0         0         0
    0.4078    0.3765    0.2824
    0.5961    0.5333    0.3765
    0.5647    0.7529    0.9098
    0.2196    0.3137    0.4706
    0.6902    0.7216    0.7529
    0.9725    0.9725    0.9725
    0.5020    0.5333    0.5961
    0.9725    0.9098    0.7843];
C.CList1827 = [
    1.0000    0.6118         0
    0.9686    0.7412    0.3529
    1.0000    0.8000    0.6000
    1.0000    1.0000    0.2000
    1.0000    1.0000    0.6118
    0.8039    0.3882    0.3882
    0.8000    0.6000    0.8000
    1.0000    0.6196    0.3882
    0.3922    0.4275    0.8000
    0.6118    0.6118    1.0000
    0.2000    0.6000    1.0000
    0.6000    0.8000    1.0000
    1.0000    1.0000    0.8000
    0.6941    0.5843    0.4784
    0.9294    0.5333    0.2980
    0.9608    0.9294         0
    0.8667    1.0000    1.0000];
C.CList1607 = [
    0.8863    0.5686    0.5686
    0.6000    0.8667    0.5725
    0.5765    0.8471    0.7255
    0.5804    0.7686    0.8275
    0.5804    0.6039    0.8078
    0.7020    0.5804    0.8000
    0.8000    0.5882    0.6941
    0.8000    0.6431    0.6000
    0.8745    0.8980    0.5725
    1.0000    0.6471    0.3765
    0.4196    1.0000    0.3882
    0.3961    1.0000    0.8000
    0.3961    0.7686    1.0000
    0.3961    0.4196    1.0000
    0.6784    0.3961    1.0000
    1.0000    0.3961    0.9569
    1.0000    0.3961    0.5176
    1.0000    0.3961    0.3961];
C.CList631 = [
    0.1059    0.6392    0.7765
    0.1725    0.7098    0.7529
    0.1882    0.7373    0.6784
    0.1294    0.6902    0.5294
    0.2000    0.6510    0.3608
    0.3412    0.6392    0.2157
    0.6353    0.7137    0.1529
    0.8353    0.7333    0.1294
    0.9725    0.7137    0.1255
    0.9725    0.5725    0.0902
    0.9412    0.4039    0.0980
    0.8784    0.2039    0.1490
    0.9647    0.2863    0.4431
    0.9882    0.4431    0.6196
    0.9216    0.4510    0.7020
    0.8078    0.4118    0.7451
    0.6353    0.4275    0.7608
    0.4706    0.4510    0.7529
    0.3098    0.4863    0.7294];
end




2 数据处理及图窗生成

matlab 复制代码
% 数据计算
cT = linspace(0, 2*pi, 200);
cX = cos(cT).*8 + 8;
cY = sin(cT).*3;
cXY = [cX;cY];
setNum = size(Data, 2);
rT = 2*pi./setNum;
rM = [cos(rT),-sin(rT); sin(rT),cos(rT)];

uniq = sum(Data.*(sum(Data,2) == 1),1);
core = sum(sum(Data,2) == setNum);

figure('Units', 'normalized', 'Position', [.1,.1,.5,.8]);
ax=gca;
ax.NextPlot = 'add';
ax.DataAspectRatio = [1,1,1];
ax.XColor = 'none';
ax.YColor = 'none';

3 绘制花

matlab 复制代码
% 绘制椭圆花瓣
for i = 0:setNum-1
    iXY = rM^i*cXY;
    fill(iXY(1,:), iXY(2,:), CList(i+1,:), 'FaceAlpha', .4, 'EdgeColor', 'none');
end
% 绘制白色边缘线
if 1
for i = 0:setNum-1
    iXY = rM^i*cXY;
    plot(iXY(1,:), iXY(2,:), 'Color', 'w', 'LineWidth', 1.2);
end
end
fill(cos(cT).*2.3, sin(cT).*2.3, [1,1,1], 'EdgeColor', 'none')

4 绘制文本

matlab 复制代码
% 绘制文本信息
for i = 1:setNum
    tR = (i-1)*rT/pi*180;
    if tR>=0 && tR<=180
        tR = tR-90;
    else
        tR = tR+90;
    end
    text(cos((i-1)*rT).*13, sin((i-1)*rT).*13, num2str(uniq(i)),...
        'HorizontalAlignment', 'center',...
        'VerticalAlignment', 'middle',...
        'Rotation', tR,...
        numFont{:})
    text(cos((i-1)*rT).*17, sin((i-1)*rT).*17, setName{i},...
        'HorizontalAlignment', 'center',...
        'VerticalAlignment', 'middle',...
        'Rotation', tR,...
        labFont{:})
end
text(0, 0, {'core';num2str(core)},...
    'HorizontalAlignment', 'center',...
    'VerticalAlignment', 'middle',...
    labFont{:})

完整代码

matlab 复制代码
% flowerPlotDemo

% 给组起名t1 t2 t3...t15
setName = compose('t%d', 1:15);

% 随机生成数据
Data = [rand(200, 15) > .1; rand(200, 15) > .85];

% 设置字体
numFont = {'FontSize', 14, 'FontName', 'Times New Roman'};
labFont = {'FontSize', 16, 'FontName', 'Times New Roman'};

% 设置配色
CList = lines(15);
% C = flowerPlotColor();
% CList = C.CList631;


% =========================================================
% 绘图部分代码
% ---------------------------------------------------------
% 数据计算
cT = linspace(0, 2*pi, 200);
cX = cos(cT).*8 + 8;
cY = sin(cT).*3;
cXY = [cX;cY];
setNum = size(Data, 2);
rT = 2*pi./setNum;
rM = [cos(rT),-sin(rT); sin(rT),cos(rT)];

uniq = sum(Data.*(sum(Data,2) == 1),1);
core = sum(sum(Data,2) == setNum);

figure('Units', 'normalized', 'Position', [.1,.1,.5,.8]);
ax=gca;
ax.NextPlot = 'add';
ax.DataAspectRatio = [1,1,1];
ax.XColor = 'none';
ax.YColor = 'none';

% 绘制椭圆花瓣
for i = 0:setNum-1
    iXY = rM^i*cXY;
    fill(iXY(1,:), iXY(2,:), CList(i+1,:), 'FaceAlpha', .4, 'EdgeColor', 'none');
end
% 绘制白色边缘线
if 1
for i = 0:setNum-1
    iXY = rM^i*cXY;
    plot(iXY(1,:), iXY(2,:), 'Color', 'w', 'LineWidth', 1.2);
end
end
fill(cos(cT).*2.3, sin(cT).*2.3, [1,1,1], 'EdgeColor', 'none')

% 绘制文本信息
for i = 1:setNum
    tR = (i-1)*rT/pi*180;
    if tR>=0 && tR<=180
        tR = tR-90;
    else
        tR = tR+90;
    end
    text(cos((i-1)*rT).*13, sin((i-1)*rT).*13, num2str(uniq(i)),...
        'HorizontalAlignment', 'center',...
        'VerticalAlignment', 'middle',...
        'Rotation', tR,...
        numFont{:})
    text(cos((i-1)*rT).*17, sin((i-1)*rT).*17, setName{i},...
        'HorizontalAlignment', 'center',...
        'VerticalAlignment', 'middle',...
        'Rotation', tR,...
        labFont{:})
end
text(0, 0, {'core';num2str(core)},...
    'HorizontalAlignment', 'center',...
    'VerticalAlignment', 'middle',...
    labFont{:})

相关推荐
眼镜哥(with glasses)31 分钟前
蓝桥杯 国赛2024python(b组)题目(1-3)
数据结构·算法·蓝桥杯
крон2 小时前
【Auto.js例程】华为备忘录导出到其他手机
开发语言·javascript·智能手机
zh_xuan3 小时前
c++ 单例模式
开发语言·c++·单例模式
老胖闲聊3 小时前
Python Copilot【代码辅助工具】 简介
开发语言·python·copilot
Blossom.1184 小时前
使用Python和Scikit-Learn实现机器学习模型调优
开发语言·人工智能·python·深度学习·目标检测·机器学习·scikit-learn
曹勖之4 小时前
基于ROS2,撰写python脚本,根据给定的舵-桨动力学模型实现动力学更新
开发语言·python·机器人·ros2
豆沙沙包?4 小时前
2025年- H77-Lc185--45.跳跃游戏II(贪心)--Java版
java·开发语言·游戏
军训猫猫头5 小时前
96.如何使用C#实现串口发送? C#例子
开发语言·c#
liuyang-neu5 小时前
java内存模型JMM
java·开发语言
int型码农5 小时前
数据结构第八章(一) 插入排序
c语言·数据结构·算法·排序算法·希尔排序