- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我脑子里有一个关于某事的思维导图,我一直在尝试弄清楚如何在 R 中对其进行编程,但我有点磕磕绊绊(也许 R 不是最佳选择),所以我正在寻求你的意见这。
思路是这样的:
(1) 我每天有两个列表,每个列表包含民主人士和共和党人最常使用的前 30 个词的两位信息 [word, frequency]。
(2) 我想画一个维恩图或欧拉图 (A) 用相对于频率的字体大小呈现单词的文本 (B) 自动将双方使用的词语放在图表的中心部分,并将独特的民主或共和党词语放在自己的部分
到目前为止,我一直在使用 VennDiagram 和 Vennerable 以及 Venneuler 包,但没有什么是完全正确的,文本显示和自动调整大小让我望而却步。有一些在线工具非常接近 (http://bioinfogp.cnb.csic.es/tools/venny/),但我想我想要一些我可以每天自动更新的工具。
有什么想法吗?
最佳答案
我觉得无聊:
import numpy as np
import matplotlib.pyplot as plt
FIG_SIZE = (10,6)
class word_list_venn_diagram(object):
def __init__(self, words, fontsizes, polarities, scale=1.):
"""
Arguments:
----------
words: [str 1, ... str N]
list of strings
fontsizes: [float 1, ... float N]
corresponding list of (relative) fontsizes
polarity: [-1, 0, 1, ..., 0, 1]
corresponding list of area designations;
polarity of 0 corresponds to intersection;
polarities -1 and 1 correspond to the disjoint sets
scale: float
scales the size of the circles with respect to the text
(w.r.t. the maximum joint height of the bounding boxes of the 3 word lists)
Returns:
--------
None
"""
self.words = np.array(words)
self.fontsizes = np.array(fontsizes)
# get bounding boxes of text
self.bboxes = [self._get_bbox(word, size) for word, size in zip(self.words, self.fontsizes)]
# determine minimum radius of circles
diameter = 0.
unique_polarities = np.unique(polarities)
for polarity in unique_polarities:
idx, = np.where(polarities == polarity)
heights = [self.bboxes[ii].height for ii in idx]
total = np.sum(heights)
if total > diameter:
diameter = total
radius = diameter / 2.
# rescale
radius *= scale
self.radius = radius
# arrange bboxes vertically
for polarity in unique_polarities:
idx, = np.where(polarities == polarity)
order = self._argsort(self.fontsizes[idx])
heights = [self.bboxes[ii].height for ii in idx]
total = np.sum(heights)
current_height = 0.
for ii in idx[order]:
self.bboxes[ii].y = current_height - total/2.
current_height += self.bboxes[ii].height
# arrange bboxes horizontally
# NB: slightly cheeky use of polarity argument
for ii, _ in enumerate(self.bboxes):
self.bboxes[ii].x = polarities[ii] * self._get_shift(self.bboxes[ii].y, self.radius)
# draw
self.fig, self.ax = self.draw()
return
def draw(self):
"""
Draws the Venn diagram.
"""
fig, ax = plt.subplots(1,1,figsize=FIG_SIZE)
# draw circles
circle_left = plt.Circle((-0.5*self.radius, 0), self.radius, color='b', fill=False, axes=ax, linewidth=5)
circle_right = plt.Circle((+0.5*self.radius, 0), self.radius, color='r', fill=False, axes=ax, linewidth=5)
ax.add_artist(circle_left)
ax.add_artist(circle_right)
# draw words
for ii, (word, bb, fs) in enumerate(zip(self.words, self.bboxes, self.fontsizes)):
ax.text(bb.x, bb.y, word,
horizontalalignment='center',
verticalalignment='center',
fontsize=fs,
bbox=dict(pad=0., facecolor='none', edgecolor='none')
)
# update data limits as circles are not registered automatically
corners = (-1.5*self.radius, -self.radius), (1.5*self.radius, self.radius)
ax.update_datalim(corners)
ax.autoscale_view()
# make figure pretty-ish
ax.set_xticks([])
ax.set_yticks([])
ax.set_aspect('equal')
ax.get_figure().set_facecolor('w')
ax.set_frame_on(False)
ax.get_figure().canvas.draw()
return fig, ax
def _get_bbox(self, word, fontsize):
"""
Get the bounding box for each word.
Unfortunately, the bbox is dependent on the renderer,
so a figure has to be created.
"""
fig = plt.figure(figsize=FIG_SIZE)
renderer = fig.canvas.get_renderer()
text = plt.text(0.5, 0.5, word,
fontsize=fontsize,
bbox=dict(pad=0., facecolor='none', edgecolor='red'))
bbox = text.get_window_extent(renderer=renderer)
plt.close(fig)
return bbox
def _argsort(self, arr):
"""
Returns indices to create a sorted array.
Entries are sorted in such a way that the largest element is in the middle,
and the size of the elements falls off towards the ends.
"""
order = np.argsort(arr)
order = np.r_[order[::2], order[1::2][::-1]]
return order
def _get_shift(self, y, r):
"""
Get point along midline of a waxing moon formed by two overlapping
circles of radius r as a function of y.
"""
x1 = np.sqrt(r**2 - y**2) + r/2. # right circle
x2 = np.sqrt(r**2 - y**2) - r/2. # left circle
x = x2 + (x1 - x2)/2. # midpoint
return x
def test():
test_string = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet."
# get a word list
words = test_string.split(' ')
# remove non alphanumeric characters
words = [''.join(ch for ch in word if ch.isalnum()) for word in words]
# count occurrences; remove duplicates
from collections import Counter
counter = Counter()
for word in words:
counter[word] += 1
words, counts = counter.keys(), np.array(counter.values())
# convert counts to reasonable fontsizes
max_fontsize = 25
max_count = np.float(np.max(counts))
fontsizes = counts / max_count * max_fontsize
# assign random polarities
polarities = np.random.choice([-1, 0, 1], len(words))
venn = word_list_venn_diagram(words, fontsizes, polarities, scale=1.5)
return
关于python - 自动维恩图文本渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42812083/
composer的安装 注:我是的PHPstudy下安装的,其他情况也相似 1、配置环境变量 1、打开系统高级设置,具体操作如下图: 路径就是php根目录 2、打开ope
spring介绍 spring概述 spring是一个开源框架,spring是2003年兴起的轻量级java开发框架,由rod johnson 在其著作 expert one
卸载tomcat9 1、因tomcat的安装只需解压到某目录,卸载也只需将原tomcat目录删除即可 2、删除相关注册表。快捷键win+r呼出”运行“,输入"regedit"
本文介绍了从零开始SSM搭建步骤,分享给大家,有助于更好的搭建ssm 第一章:搭建整合环境 1. 搭建整合环境 整合说明:SSM整合可以使用多种方式,咱们会选择XML + 注解的方式 整合
tomcat 服务器是一个免费的开放源代码的 web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 jsp 程序的首选。本文主要讲述windo
1、建立虚拟主机 那么一个服务器上有两个网站,用户如何访问这两个网站呢?可以有三种方法。 1>两个网站使用不同的IP地址。这样用户在访问第一个网站需在浏览器中输入http://192.1
tomcat安装时默认的端口设置的是8080,而http协议的默认端口是80,所以测试tomcat时需要输入的网址为“http://localhost:8080”,若把tomcat的端口设置为80,
先谈谈dllhotst进程消耗cpu 100%的问题: 服务器正常cpu消耗应该在75%以下,而且cpu消耗应该是上下起伏的,出现这种问题的服务器,cpu会突然一直处 100%的水平,而且不会下降
介绍 kafka是一个分布式的、可分区的、可复制的消息系统。它提供了普通消息系统的功能,但具有自己独特的设计。这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统术语: •kafka将
URL 静态化可以提高搜索引擎抓取,开启本功能需要对 Web 服务器增加相应的 Rewrite 规则,且会轻微增加服务器负担。本教程讲解如何在 IIS 环境下配置各个产品的 Rewrite 规则。
(amh为独立的一套lnmp/nginx虚拟主机面板,安装请使用纯净系统。不要安装其它的环境包。) (需要使用amh,请先检查你的系统是否支持,amh面板已支持centos、debian、ubunt
在爬虫的过程中,我们经常会遇见很多网站采取了防爬取技术,或者说因为自己采集网站信息的强度和采集速度太大,给对方服务器带去了太多的压力。 如果你一直用同一个代理ip爬取这个网页,很有可能ip会被禁止
*注:此文章谨以记录学习过程,分享学习心得! 刚刚开始了解springboot框架,觉得很好用,觉得很有必要深入学习一下该框架,现在就来创建一个springboot项目: 1、在idea上新建一
自从还了mac 后,原来的笔记本就闲置了下来,这台笔记本的配置还是不错的,可以装几个虚拟机用来平时的搭建小规模集群的实践。 准备工作 安装vmware 版本 :vmware workstati
前言 在用deepin用户界面的时候,做的是真心的好看,界面效果是真的美观简洁,没有那些花哨的特效,就是刚开始还有点不习惯的,尽量安装的时候电脑配置稍微高一点的, deepin 还是比较吃配置的,
本文着重讲解了windows下Git安装教程(图文),文中通过代码实例讲解的非常细致,对大家的工作和学习具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 github是一个项
重装原因:N点无法开通空间提示错误,我们希望重装N点后可以保留已开空间的信息。 1、备份N点管理系统的数据库,具体路径是C:\Program Files\NpointSoft\npointhost
本机电脑系统为:win7 本文以图片为主,含有大量图片 安装centos7虚拟机 新建虚拟机 一直点击下一步,直到分配内存(此处我分配了20g,根据个人情况而定) 创建成功后对硬
Godaddy每月给力的域名神码都深深地吸引着大批大批的站长们,可域名快要到期,转出或者续费就成为一个头痛的事情,下面给出最新的Godaddy域名转出教程,希望能帮助到大家。 1、登录Godad
复制数据库前要先确认目标数据库的服务是否启动 主要是sql server (mssqlserver)这个服务要启动起来其他的看自己的需求 复制数据库 下一步 输入
我是一名优秀的程序员,十分优秀!