社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python可视化:用Matplotlib画个玫瑰图

EasyCharts • 7 年前 • 1257 次点击  

第一次写教程的,python小白,求不喷,求大神指点指点

之前看了很多关于绘制玫瑰图的教程,有基于R的ggplot2的或者用AI的艺术画笔做的,但是似乎很少有用malplotlib来做,最近刚好研究下matplotlib里的极坐标的用法,于是模仿着一些图,尝试了一下画玫瑰图,感觉效果还行。先Po原图和成品

网易数独的
DT财经的

以下是尝试模仿的成品:

emmmm,差不多 差不多就行,哈哈哈 100%还原太麻烦了

文字的和其他的修饰,作者实在嫌麻烦,有兴趣的朋友,可以自己尝试一下

下面进入教学时间,大家鼓掌

1.什么是玫瑰图

玫瑰图,玫瑰图,就是长得像玫瑰一样美丽的图(一耳光,pia扇飞了,不要说废话)

emmm,玫瑰图其实就是被掰弯了的柱状图(o(*////▽////*)q的捂脸)

2.怎么掰弯了个笔直的柱状图

用爱(又是一耳光,能不能正经点这位作者)

emmm, 把在笛卡尔坐标系里的柱状图,画到极坐标系去

3.什么是极坐标

长这样:

一个装逼的圆形

传统的笛卡尔坐标是这样的:

最熟悉的陌生人

笛卡尔坐标系中,靠x,y两个值能确定一个点的位置,而在极坐标中,考的是r(半径),θ(角度)来确定一个点的位置。

知识点:想把柱状图从笛卡尔家搬到极坐标家去,重要的就是算好θ

4.先画一个90度半圆

为了能打好基础,我们先来画个如下半圆。

import numpy as np 
import matplotlib.pyplot as plt
y=20
x=np.pi/2
w=np.pi/2
color=(206/255,32/255,69/255)
edgecolor=(206/255,32/255,69/255)
fig=plt.figure(figsize=(13.44,7.5))#建立一个画布
ax = fig.add_subplot(111,projection= 'polar')#建立一个坐标系,projection='polar'表示极坐标
ax.bar(left=x, height=y, width=w,bottom=10,color=color,edgecolor=color)
fig.savefig('E:\\test.png',dpi=400,bbox_inches='tight',transparent=True)

可以很清楚的发现
在笛卡尔坐标系中,一个柱状图由left,bottom,height,width四个参数决定位置和大小left决定了左边界,bottom决定了下边界,height决定了长度,width决定了宽度.

对应到笛卡尔坐标系中,left决定了扇形的中线位置,然后height决定扇形的长度,bottom决定了下边界,width决定了扇形的宽度。

能在目标位置画上一个扇形,基本上我们就能开始画玫瑰图辣!回到我们的例子中来

我们来分析一下

这个图由十个大扇形构成底图,然后中间在加上2个小的扇形。

所以先计算,十个大扇形的位置,思路大概是,把一个圆分成十份,然后找到十个扇形中线对应的θ。

x1=[np.pi/10+np.pi*i/5 for i in range(1,11)]

然后在计算20个小扇形的位置

x2=[np.pi/20+np.pi*i/5 for i in range(1,11)]
x3=[3*np.pi/20+np.pi*i/5 for i in range(1,11)]

由于作者很怕麻烦,所以y值就随机生成了

先画第一层,最外圈的放文字的位置。

为了能画出线来,作者用重叠的方式,先画个半径是7000,在画个半径是6000,然后




    
x1=[np.pi/10+np.pi*i/5 for i in range(1,11)]
x2=[np.pi/20+np.pi*i/5 for i in range(1,11)]
x3=[3*np.pi/20+np.pi*i/5 for i in range(1,11)]
y1=[7000 for i in range(0,10)]
y2=[6000 for i in range(0,10)]
fig=plt.figure(figsize=(13.44,7.5))
ax = fig.add_subplot(111,projection='polar')
ax.axis('off')
ax.bar(left=x1, height=y1,width=np.pi/5,color=(220/255,222/255,221/255),edgecolor=(204/255,206/255,205/255))
ax.bar(left=x1, height=y2,width=np.pi/5,color='w',edgecolor=(204/255,206/255,205/255))
random.seed(100)
y4=[random.randint(4000,5500) for i in range(10)]
y5=[random.randint(3000,5000) for i in range(10)]

ax.bar(left=x2, height=y4,width=np.pi/10,color=(206/255,32/255,69/255),edgecolor=(206/255,32/255,69/255))
ax.bar(left=x3, height=y5,width=np.pi/10,color=(34/255,66/255,123/255),edgecolor=(34/255,66/255,123/255))

然后我们在画中间的

最后在在中间画一个白色的小圆

y6=[2000 for i in range(0,10)]
ax.bar(left=x1, height=y6,width=np.pi/5,color='w',edgecolor='w')

大功告成,撒花

本文已由原作者授权

如需转载请联系EasyCharts团队!


【书籍推荐】《Excel 数据之美--科学图表与商业图表的绘制》

【手册获取】国内首款-数据可视化参考手册:专业绘图必备

【必备插件】  EasyCharts -- Excel图表插件

【网易云课堂】  Excel 商业图表修炼秘笈之基础篇



今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/N33spEbVMz
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/7527
 
1257 次点击