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

相关推荐
Benny_Tang3 小时前
题解:P7989 [USACO21DEC] Bracelet Crossings G
c++·算法
YSRM3 小时前
Leetcode+Java+图论+并查集
算法·leetcode·图论
有时间要学习3 小时前
Qt——窗口
开发语言·qt
消失的旧时光-19434 小时前
@JvmStatic 的作用
java·开发语言·kotlin
skywalk81634 小时前
基于频域的数字盲水印blind-watermark
linux·开发语言·python
Tiger_shl4 小时前
三大并发集合ConcurrentDictionary、ConcurrentBag、ConcurrentQueue
开发语言·c#
火锅机器4 小时前
java 8 lambda表达式对list进行分组
java·开发语言·list
shaominjin1234 小时前
android在sd卡中可以mkdir, 但是不可以createNewFile
android·开发语言·python
筱砚.4 小时前
【STL——stack容器】
开发语言·c++