前两天看到了一个非常好看的可视化案例(https://www.reddit.com/r/dataisbeautiful/comments/8ivizh/visualisation_of_words_spoken_between_romeo_and/):

继续手痒想绘制一下试试,但是原可视化并没有提供数据,我也懒得真的去统计各个人物之间交流单词数量,因此我统计了各个人物说话出现顺序,认为只要相邻就是互相之间有过交流,弄了个笼统的统计绘制了下图:

绘制效果


基础教程

数据处理

罗密欧与朱丽叶全文出自网站:
http://shakespeare.mit.edu/romeo_juliet/full.html

我将全文复制到romeo_juliet.txt文件并将其导入MATLAB进行了粗略统计,得到的结果是一个20x20的矩阵:

% 基本数据
strData=readcell('romeo_juliet.txt');
strData=strData(:,1);
nameStr={'Romeo','Juliet','Friar Laurence','Friar John','Abraham','Balthasar',...'Montague','Lady Montague','Benvolio','Apothecary','Mercutio','Prince','Paris','Tybalt',...'Sampson','Gregory','Lady Capulet','Capulet','Nurse','Peter'};% =========================================================================
% 统计各个人物前后出现次数
orderList=zeros(size(strData));
for i=1:length(nameStr)orderList(strcmpi(nameStr{i},strData))=i;
end
orderList(orderList==0)=[];
corrMat=zeros(length(nameStr));
for i=1:length(orderList)-1corrMat(orderList(i),orderList(i+1))=corrMat(orderList(i),orderList(i+1))+1;
end
corrMat=corrMat+corrMat.';

配色

配色数据提取的方式很多,可以qq取色或者ppt取色,我公众号上也有一些取色器工具,可以自行查找下载取用,这是图片中用到的配色:

colorList=[48,115,100;177,58,71;252,193,13;108,60,143]./255;

点位置

写了一个很短的程序,运行后生成图窗,在想要取点的位置点击就能获得放缩到[-1,1]范围内的数据点(红蓝十字所示),这个程序只是为了自己方便大家可自行改进:

function getlinesl(fileName)
tpic=imread(fileName);
ax=gca;hold on
ax.XLim=[-1,1];
ax.YLim=[-1,1];
image([-1,1],[-1,1],flipud(tpic))
[m,n,~]=size(tpic);
ax.DataAspectRatio=[m,n,1];
baHdl=plot(0,0,'b+','MarkerSize',12,'LineWidth',1.5);
rxHdl=plot(0,0,'rx','MarkerSize',12,'LineWidth',1.5);
pntSet=zeros(0,2);
set(gcf,'WindowButtonDownFcn',@buttondown)function buttondown(~,~)xy=get(gca,'CurrentPoint');xp=xy(1,2);yp=xy(1,1);pos=[yp,xp];if strcmp(get(gcf,'SelectionType'),'normal')pntSet=[pntSet;pos];elseif size(pntSet,1)>0pntSet(end,:)=[];endbaHdl.XData=pntSet(:,1);baHdl.YData=pntSet(:,2);rxHdl.XData=pntSet(:,1);rxHdl.YData=pntSet(:,2);pntSetsave data.mat pntSetend
end

使用方法就是命令行运行getlinesl('test.png')其中括号内是图片地址。

% 各个人物点位置
posXY=[-0.1598   -0.0682; 0.3117   -0.0060;-0.0389    0.4154;-0.1874    0.5155;-0.3877    0.5691;-0.6693    0.5397;-0.8092    0.2599;-0.7522   -0.0959;-0.5915   -0.3515;-0.4465   -0.5294;-0.2668   -0.6503;-0.0060   -0.7867;0.2202   -0.6503; 0.4275   -0.5173; 0.5933   -0.3515; 0.7228   -0.1563;0.8040    0.1045; 0.7642    0.3653; 0.5259    0.5622; 0.2323    0.5121];

绘制图像

% 坐标区域修饰
figure('Position',[400,100,850,850],'Name','slandarer')
ax=gca;hold on
ax.XLim=[-1,1];
ax.YLim=[-1,1];
ax.Color=[0,0,0];
ax.XTick=[];
ax.YTick=[];
ax.DataAspectRatio=[1,1,1];
maxWidth=max(corrMat(corrMat>0));
minWidth=min(corrMat(corrMat>0));
ttList=linspace(0,1,3)';
% 循环绘图
for i=1:size(corrMat,1)  for j=i+1:size(corrMat,2)if corrMat(i,j)>0tW=(corrMat(i,j)-minWidth)./(maxWidth-minWidth);colorData=(1-ttList).*colorList(classNum(i),:)+ttList.*colorList(classNum(j),:);CData(:,:,1)=colorData(:,1);CData(:,:,2)=colorData(:,2);CData(:,:,3)=colorData(:,3);% 绘制连线fill(linspace(posXY(i,1),posXY(j,1),3),...linspace(posXY(i,2),posXY(j,2),3),[0,0,0],'LineWidth',tW.*6+2.5,...'CData',CData,'EdgeColor','interp','EdgeAlpha',.5,'FaceAlpha',.5)endend% 绘制人物圆点scatter(posXY(i,1),posXY(i,2),30,'filled','LineWidth',1.2,...'MarkerFaceColor',colorList(classNum(i),:),'MarkerEdgeColor',[.7,.7,.7]);
end

图例

% 绘制图例
lgdSet(length(classStr))=nan;
for i=1:length(classStr)lgdSet(i)=fill([0,0],[0,0],colorList(i,:));
end
lgdHdl=legend(lgdSet,classStr,'Box','off','Location','South','Orientation','horizontal',...'TextColor',[1,1,1],'FontName','Cambria','FontSize',12);
lgdHdl.ItemTokenSize=[8,8];

标题

% 绘制标题
text(0,0.8,'ROMEO & JULIET','FontSize',30,'FontWeight','bold','Color',...[1,1,1],'HorizontalAlignment','center','FontName','Cambria')
text(0,0.68,'Number of conversations between characters','FontWeight','bold','Color',...[1,1,1].*.7,'HorizontalAlignment','center','FontName','Cambria','FontSize',15)

绘制人名

% 绘制人物文字
for i=1:size(corrMat,1)  text(posXY(i,1),posXY(i,2)-.001,nameStr{i},'FontName','Cambria','FontSize',13,...'HorizontalAlignment','center','Color',[1,1,1]);
end


完整代码

clc;clear
% 基本数据
strData=readcell('romeo_juliet.txt');
strData=strData(:,1);
nameStr={'Romeo','Juliet','Friar Laurence','Friar John','Abraham','Balthasar',...'Montague','Lady Montague','Benvolio','Apothecary','Mercutio','Prince','Paris','Tybalt',...'Sampson','Gregory','Lady Capulet','Capulet','Nurse','Peter'};
% 各个人物家族分类
classNum=[1,2,4,4,1,1,1,1,1,4,3,3,3,2,2,2,2,2,2,2];
classStr={'House Montague','House Capulet','House Escalus','Other personages'};
% 各个人物点位置
posXY=[-0.1598   -0.0682; 0.3117   -0.0060;-0.0389    0.4154;-0.1874    0.5155;-0.3877    0.5691;-0.6693    0.5397;-0.8092    0.2599;-0.7522   -0.0959;-0.5915   -0.3515;-0.4465   -0.5294;-0.2668   -0.6503;-0.0060   -0.7867;0.2202   -0.6503; 0.4275   -0.5173; 0.5933   -0.3515; 0.7228   -0.1563;0.8040    0.1045; 0.7642    0.3653; 0.5259    0.5622; 0.2323    0.5121];
colorList=[48,115,100;177,58,71;252,193,13;108,60,143]./255;% =========================================================================
% 统计各个人物前后出现次数
orderList=zeros(size(strData));
for i=1:length(nameStr)orderList(strcmpi(nameStr{i},strData))=i;
end
orderList(orderList==0)=[];
corrMat=zeros(length(nameStr));
for i=1:length(orderList)-1corrMat(orderList(i),orderList(i+1))=corrMat(orderList(i),orderList(i+1))+1;
end
corrMat=corrMat+corrMat.';
% =========================================================================
% 开始绘图% 坐标区域修饰
figure('Position',[400,100,850,850],'Name','slandarer')
ax=gca;hold on
ax.XLim=[-1,1];
ax.YLim=[-1,1];
ax.Color=[0,0,0];
ax.XTick=[];
ax.YTick=[];
ax.DataAspectRatio=[1,1,1];
maxWidth=max(corrMat(corrMat>0));
minWidth=min(corrMat(corrMat>0));
ttList=linspace(0,1,3)';
% 循环绘图
for i=1:size(corrMat,1)  for j=i+1:size(corrMat,2)if corrMat(i,j)>0tW=(corrMat(i,j)-minWidth)./(maxWidth-minWidth);colorData=(1-ttList).*colorList(classNum(i),:)+ttList.*colorList(classNum(j),:);CData(:,:,1)=colorData(:,1);CData(:,:,2)=colorData(:,2);CData(:,:,3)=colorData(:,3);% 绘制连线fill(linspace(posXY(i,1),posXY(j,1),3),...linspace(posXY(i,2),posXY(j,2),3),[0,0,0],'LineWidth',tW.*6+2.5,...'CData',CData,'EdgeColor','interp','EdgeAlpha',.5,'FaceAlpha',.5)endend% 绘制人物圆点scatter(posXY(i,1),posXY(i,2),30,'filled','LineWidth',1.2,...'MarkerFaceColor',colorList(classNum(i),:),'MarkerEdgeColor',[.7,.7,.7]);
end
% 绘制人物文字
for i=1:size(corrMat,1)  text(posXY(i,1),posXY(i,2)-.001,nameStr{i},'FontName','Cambria','FontSize',13,...'HorizontalAlignment','center','Color',[1,1,1]);
end
% 绘制标题
text(0,0.8,'ROMEO & JULIET','FontSize',30,'FontWeight','bold','Color',...[1,1,1],'HorizontalAlignment','center','FontName','Cambria')
text(0,0.68,'Number of conversations between characters','FontWeight','bold','Color',...[1,1,1].*.7,'HorizontalAlignment','center','FontName','Cambria','FontSize',15)% 绘制图例
lgdSet(length(classStr))=nan;
for i=1:length(classStr)lgdSet(i)=fill([0,0],[0,0],colorList(i,:));
end
lgdHdl=legend(lgdSet,classStr,'Box','off','Location','South','Orientation','horizontal',...'TextColor',[1,1,1],'FontName','Cambria','FontSize',12);
lgdHdl.ItemTokenSize=[8,8];

完整代码及数据
链接:https://pan.baidu.com/s/1cMU6f8IVilvk9-u_eySB-Q?pwd=slan
提取码:slan

MATLAB | 可视化 | 罗密欧与朱丽叶的数据统计相关推荐

  1. dataframe记录数_大数据系列之Spark SQL、DataFrame和RDD数据统计与可视化

    Spark大数据分析中涉及到RDD.Data Frame和SparkSQL的操作,本文简要介绍三种方式在数据统计中的算子使用. 1.在IPython Notebook运行Python Spark程序 ...

  2. 小福利,采用excel函数制作大屏可视化,用sumifs函数快速统计汇总数据,锁行锁列以及锁列不锁行

    小福利,采用excel函数制作大屏可视化,用sumifs函数快速统计汇总数据,锁行锁列以及锁列不锁行 源数据如下图所示 第一步处理源数据的效果是下图 其中根据年份变化,求总订单量.总销量.总销售额,只 ...

  3. 物流可视化平台/大屏看板/图表统计/运单跟踪/物流数据统计/物流看板/运单量统计/axure原型/大屏数据可视化/动效可视化数据大屏看板

    作品介绍:物流可视化平台/大屏看板/图表统计/运单跟踪/物流数据统计/物流看板/运单量统计/axure原型/大屏数据可视化/动效可视化数据大屏看板 Axure原型演示及下载地址:Untitled Do ...

  4. 实战 | 用Python爬取《云南虫谷》3.6万条评论,并做数据统计可视化展示分析,好看!...

    最近鬼吹灯系列网剧<云南虫谷>上线,作为鬼吹灯系列作品,承接上部<龙岭迷窟>内容,且还是铁三角原班人马主演,网友直呼非常好看! 今天,我们就用Python爬取目前全部剧集的评论 ...

  5. 实战|用Python爬取《云南虫谷》3.6万条评论,并做数据统计可视化展示分析,好看!

    大家好,我是才哥. 最近鬼吹灯系列网剧<云南虫谷>上线,作为鬼吹灯系列作品,承接上部<龙岭迷窟>内容,且还是铁三角原班人马主演,网友直呼非常好看! 今天,我们就用Python爬 ...

  6. 个推数据统计产品(个数)iOS集成实践

    2019独角兽企业重金招聘Python工程师标准>>> 最近业务方给我们部门提了新的需求,希望能一站式统计APP的几项重要数据.这次我们尝试使用的是个推(之前专门做消息推送的)旗下新 ...

  7. 移动端数据统计,精细化运营的永动机

    2019独角兽企业重金招聘Python工程师标准>>> 前言 随着移动互联网市场快速发展,以往"跑马圈地"式的粗犷运营时代已成为过去时.大环境的改变,也导致移动端 ...

  8. 【竞赛算法学习】学术前沿趋势分析-论文数据统计

    任务1:论文数据统计 1.1 任务说明 任务主题:论文数量统计,即统计2019年全年计算机各个方向论文数量: 任务内容:赛题的理解.使用 Pandas 读取数据并进行统计: 任务成果:学习 Panda ...

  9. 数据统计 测试方法_统计测试:了解如何为数据选择最佳测试!

    数据统计 测试方法 This post is not meant for seasoned statisticians. This is geared towards data scientists ...

最新文章

  1. python字典、列表、元祖使用场景_python学习第七讲,python中的数据类型,列表,元祖,字典,之元祖使用与介绍...
  2. Intellij Idea使用教程汇总篇
  3. //输入学生人数,挨个输入姓名,身高,年龄,求平均年龄,然后按身高降序排列输出...
  4. url、base64、blob,三者之间的转化
  5. 骆驼路线的主/从故障转移
  6. 使用Eclipse-Maven-git做Java开发(13)--导入git仓库的代码到eclipse
  7. jsp篇 之 指令元素和动作元素
  8. gif生成工具(免费)
  9. 美团搜索多业务商品排序探索与实践
  10. Mac 系统安装Chromedriver
  11. 关于Nginx mmap(MAP_ANON|MAP_SHARED, 314572800)报错
  12. python ipados_iPadOS 的真实体验如何?
  13. SANER 2018 论文阅读- Dissection of a Bug Dataset: Anatomy of 395 Patches from Defects4J
  14. 服务器显示器多少寸合适,购买别冲动!先看多大的显示器适合你
  15. RSA密钥BEGIN CERTIFICATE、BEGIN RSA PRIVATE KEY和BEGIN PRIVATE KEY的区别
  16. 企业的应用架构演变之路
  17. java.lang.IllegalStateException: No instances available for 的解决思路
  18. 分数乘法计算机题,《分数乘法》测试题
  19. MATLAB 2021b详解
  20. [Axis2]org.apache.axiom.om.NodeUnavailableException

热门文章

  1. 终极 3D 图形工具包:Ab3d.PowerToys 10.2.X Crack
  2. 还在用print()查找错误?日志消息这顿排骨它不香嘛?
  3. 店盈通带你看,拼多多商品标题怎么写?有什么方法?
  4. 全球最动听的英文花名
  5. mysql mklink_挂载与链接(assign与mklink)——Windows 7的磁盘分区规划 | 学步园
  6. Docker如何对镜像进行命名
  7. 电子图书的编目和OPAC揭示
  8. QML入门教程(10) : QML圆形延时按钮
  9. 《明朝那些事儿》(书感)
  10. php 动力环境监控,机房动力环境监控系统