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{:})

相关推荐
小喵要摸鱼1 小时前
【MATLBA】使用教程
matlab
自由随风飘2 小时前
python 题目练习1~5
开发语言·python
cynicme2 小时前
力扣3318——计算子数组的 x-sum I(偷懒版)
java·算法·leetcode
Bony-3 小时前
Go语言完全学习指南 - 从基础到精通------语言基础篇
服务器·开发语言·golang
fl1768314 小时前
基于python的天气预报系统设计和可视化数据分析源码+报告
开发语言·python·数据分析
ACP广源盛139246256734 小时前
(ACP广源盛)GSV6172---MIPI/LVDS 信号转换为 Type-C/DisplayPort 1.4/HDMI 2.0 并集成嵌入式 MCU
c语言·开发语言·单片机·嵌入式硬件·音视频
不穿格子的程序员5 小时前
从零开始刷算法-栈-括号匹配
java·开发语言·
雪域迷影5 小时前
C#中通过get请求获取api.open-meteo.com网站的天气数据
开发语言·http·c#·get
yue0085 小时前
C#类继承
java·开发语言·c#
Want5955 小时前
Python汤姆猫
开发语言·python