绘图杂记21Python 绘制折扇图嵌套环图山峦图

Posted 卖山楂啦prss

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了绘图杂记21Python 绘制折扇图嵌套环图山峦图相关的知识,希望对你有一定的参考价值。

学习、修改、参考自:
https://mp.weixin.qq.com/s/lP_zc3moRpoccBYAWIFR1Q

import pandas as pd
import numpy as np
from palettable.colorbrewer.colorbrewer import get_map
import matplotlib.pyplot as plt
# 正常显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']
# 正常显示负号
plt.rcParams['axes.unicode_minus'] = False

values = np.arange(10,0,-1)*100 # 从大到小排序
labels = ["北京","广东", "浙江", "江苏", "四川", "湖北", "上海", "深圳", "重庆", "天津"]
# 计算坐标
width = 2*np.pi/len(labels)
theta = np.linspace(0, 2*np.pi, len(labels), endpoint=False) + width/2
# 色板为Spectral
colors = get_map("Spectral", "diverging", len(labels), reverse=True).hex_colors
#绘图
fig = plt.figure(figsize=(8, 8), dpi=100) 
ax = fig.add_subplot(111, projection="polar")
ax.bar(theta, values, width=width, color=colors, alpha=0.8)
# 添加文字标签
for i,j in zip(range(len(labels)),colors):
    ax.text(theta[i], values[i] + 120,
            "{}\\n{}亿".format(labels[i], values[i]),fontsize=14-i*2/3, 
            color=j, va="center", ha="center")  
ax.set_theta_direction(1) # 设置旋转方向
ax.set_theta_offset(np.pi/1) # 设置旋转起点
ax.set_axis_off() # 隐藏坐标轴
ax.set_title("折扇图", fontsize=20);

import pandas as pd
import numpy as np
from palettable.colorbrewer.colorbrewer import get_map
import matplotlib.pyplot as plt
# 正常显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']
# 正常显示负号
plt.rcParams['axes.unicode_minus'] = False

# 外圈 
labels1 = ['重庆', '北京', '天津', '上海']
values1 = [200, 160, 150, 100]

# 内圈
labels2 = [
    ['渝北区', '江北区', '巴南区'], 
    ['朝阳区', '西城区', '丰台区'],
    ['和平区', '河东区', '河西区'],
    ['黄浦区', '长宁区', '虹口区']]
values2 = [
    [100, 60, 40], # 从大到小排序
    [100, 40, 20],
    [100, 40, 10],
    [60, 20, 20]]


colors1 = ['#177cb0', '#9d2933', '#0aa344', '#E6550D'] 
colors2 = [
 ['#2894FF', '#84C1FF', '#C4E1FF'],
 ['#db5a6b', '#f47983', '#ffb3a7'],
 ['#73C08B','#A8E0B7', '#CBEAD1'],
 ['#ff7500', '#FDAE6B', '#FFE4B5']]


# 绘图
fig, ax = plt.subplots(figsize=(9,9))
# 绘制外层饼图
ax.pie(x=values1, 
       labels=labels1, 
       explode=[0.01]*len(labels1),
       colors=colors1, #颜色
       startangle=180,
       labeldistance=1.06,
       textprops={'fontsize': 20},
       wedgeprops={'alpha': 0.8, 'width': 0.2}
      )
# 内层饼图
ax.pie(x=flatten(values2), 
       labels=flatten(labels2), # 标签
       explode=[0.01]*len(flatten(labels2)),
       colors=flatten(colors2), # 颜色
       labeldistance=0.75,
       startangle=180, 
       radius=0.79, # 内圈距外圈距离
       textprops={'va': 'center', 'ha': 'center','fontsize': 14},
       rotatelabels=True,
       wedgeprops={'alpha': 0.8, 'width': 0.4}
      )
fig.set_facecolor('white');

import pandas as pd
import numpy as np
from scipy import stats
from matplotlib import ticker
from palettable.colorbrewer.colorbrewer import get_map
import matplotlib.pyplot as plt
# 正常显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']
# 正常显示负号
plt.rcParams['axes.unicode_minus'] = False



def plot_ridges(ax, X, Y1, buttoms, labels, colors, **kw):
    if np.array(X).ndim == 1:
        X = [X]*len(Y1) # X可以与Y形状相同,也可以是1个序列
        n = 0
    for y in Y1:
        y = np.array(y) - np.min(np.array(y)) # 去除基线
        # fill_between将曲线下面的部分进行填色
        # X[n] 覆盖的区域
        # y + buttoms[n] 覆盖的下限
        ax.fill_between(X[n], y + buttoms[n], buttoms[n], where=y>0, color=colors[n], 
                        label=labels[n], **kw)
        
        ax.plot(X[n], y + buttoms[n], color=colors[n])
        n += 1
    return ax



X = np.arange(-8, 8, 0.1) # 既可以是1个序列,也可以多个序列组成的列表
# 多个序列组成的列表
# apply_along_axis将arr数组的每一个元素经过func函数变换形成的一个新数组
# numpy.apply_along_axis(func, axis, arr, *args, **kwargs)
# fun = lambda x: stats.norm(-4,1).pdf(x)
# axis 作用于行还是列
# arr 要变换的数组
# fun中的scipy.stats.norm函数 可以实现正态分布,pdf : 概率密度函数
# stats.norm(0,1)表示均值是0,方差是1的正态分布
Y = [np.apply_along_axis(lambda x: stats.norm(0,1).pdf(x), 0, X)*2,  # 方差都为1
     np.apply_along_axis(lambda x: stats.norm(-2,1).pdf(x), 0, X)*2, 
     np.apply_along_axis(lambda x: stats.norm(-4,1).pdf(x), 0, X)*2, 
     np.apply_along_axis(lambda x: stats.norm(2,1).pdf(x), 0, X)*2, 
     np.apply_along_axis(lambda x: stats.norm(4,1).pdf(x), 0, X)*2]



colors = get_map("Set2", "qualitative", len(Y), reverse=False).hex_colors # 设置颜色
buttoms = [0, 1, 2, 3, 4] # 设置基线偏移,长度与Y一致(将每一个分布图分离)
labels = ["y1", "y2", "y3", "y4", "y5"] # 图例标签,长度与Y一致

# 绘图
fig, ax = plt.subplots(figsize=(10, 10))
plot_ridges(ax, X, Y, buttoms, labels, colors)
ax.legend(loc='best', title="图例")# 图例
ax.yaxis.set_major_locator(ticker.NullLocator()) # 隐藏刻度
ax.set_title("山峦图", fontdict={'fontsize': 15},backgroundcolor='#ffc773',fontweight='bold',color='white')


更多请查看参考文章

以上是关于绘图杂记21Python 绘制折扇图嵌套环图山峦图的主要内容,如果未能解决你的问题,请参考以下文章

数据可视化应用绘制极坐标(附Python代码)

Python 绘图个人总结--包括绘制曲线二维栅格图三维栅格图

可视化实验八:利用Python绘制柱状图条形图

可视化实验八:利用Python绘制柱状图条形图

python3——matplotlib绘图1

python 绘制和密度图笔记