美文网首页
python绘制饼图-有负值

python绘制饼图-有负值

作者: Aerosols | 来源:发表于2019-07-07 10:50 被阅读0次

第一版饼图 可实现功能:循环出带负值的饼图

import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import datetime
import os
import time
import glob
import netCDF4 as nc
from netCDF4 import Dataset

# -*- coding: UTF-8 -*-

#mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['font.sans-serif']=['Times New Roman']
plt.rcParams['axes.unicode_minus'] = False


file_path=r'E:\ct.nc'
file = Dataset(file_path)
#file.variables

cas=(file.variables['cas'][:])  ##5*9*4
ctr=(file.variables['ctr'][:])  ##5*9*23
ctname=["B","S","J","Z","J"]
colors=["tab:blue","tab:red","lightcoral","tab:orange","gold","darkgoldenrod","tan","tab:gray"]

def func2(pct, allvals, plist):
    tsum = np.sum(allvals)
    spct = pct*tsum/100
    for i, val in enumerate(allvals):
        #print(i,val,spct)
        if abs(spct - val) < 1.e-4:
            index = i
    
    if plist[index] <0 :
        spct = spct*(-1)
    
    #print(index,spct)
    return "{:.0f}%".format(spct)

for i in range(5):

   fig,axs = plt.subplots(nrows=2, ncols=3,figsize=(6, 5), dpi=300,subplot_kw=dict(aspect="equal"))
   plt.subplots_adjust(hspace=0.01,wspace = 0.05)
    #fig.subplots_adjust(bottom=0.1, right=0.8, top=0.9)
   plist1 = ctr[i,0:8,0]
   pabs1 = [ abs(x) for x in plist1 ]  #绝对值
   plist2 = ctr[i,0:8,1]
   pabs2 = [ abs(x) for x in plist2 ]  #绝对值
   plist3 = ctr[i,0:8,2]
   pabs3 = [ abs(x) for x in plist3 ]  #绝对值
   plist4 = ctr[i,0:8,3]
   pabs4 = [ abs(x) for x in plist4 ]  #绝对值
   plist5 = ctr[i,0:8,4]
   pabs5 = [ abs(x) for x in plist5 ]  #绝对值
   
   ingredients = ["MET","PL","PR","LC","LTC","RTC","RLC","CP"]

   ##绘图1
   
   wedges, texts, autotexts = axs[0,0].pie(pabs1, autopct=lambda x: func2(x, pabs1, plist1),
                                     textprops=dict(fontsize=20,color="w"),radius=1.2,colors=colors)
   
   plt.setp(autotexts, size=8, weight="bold")
   axs[0,0].set_title("2017/11/03 \n PM$_2$$_.$$_5$  {:.0f}(μg/m$^3$)".format(ctr[i,8,0]))
   #axs[0,0].legend(wedges, ingredients,
   #          loc="center left",
   #          bbox_to_anchor=(0.18,1.29),ncol=4)
   
   
   #### 2
   wedges, texts, autotexts = axs[0,1].pie(pabs2, autopct=lambda x: func2(x, pabs2, plist2),
                                     textprops=dict(fontsize=20,color="w"),radius=1.2,colors=colors)
   
   plt.setp(autotexts, size=8, weight="bold")
   axs[0,1].set_title("2017/11/04 \nPM$_2$$_.$$_5$  {:.0f}(μg/m$^3$)".format(ctr[i,8,1]))
   
   #### 3
   wedges, texts, autotexts = axs[0,2].pie(pabs3, autopct=lambda x: func2(x, pabs3, plist3),
                                     textprops=dict(fontsize=20,color="w"),radius=1.2,colors=colors)
   
   plt.setp(autotexts, size=8, weight="bold")
   axs[0,2].set_title("2017/11/05 \n PM$_2$$_.$$_5$  {:.0f}(μg/m$^3$)".format(ctr[i,8,2]))

   ### 4
   wedges, texts, autotexts = axs[1,0].pie(pabs4, autopct=lambda x: func2(x, pabs4, plist4),
                                     textprops=dict(fontsize=20,color="w"),radius=1.2,colors=colors)
   
   plt.setp(autotexts, size=8, weight="bold")
   axs[1,0].set_title("2017/11/06 \n PM$_2$$_.$$_5$  {:.0f}(μg/m$^3$)".format(ctr[i,8,3]))
   
   ### 5
   wedges, texts, autotexts = axs[1,1].pie(pabs5, autopct=lambda x: func2(x, pabs5, plist5),
                                     textprops=dict(fontsize=20,color="w"),radius=1.2,colors=colors)
   
   plt.setp(autotexts, size=8, weight="bold")
   #axs[1,1].set_title("2017/11/07"+" "+str(ctr[i,8,4]))
   axs[1,1].set_title("2017/11/07 \n PM$_2$$_.$$_5$  {:.0f}(μg/m$^3$)".format(ctr[i,8,4]))
   
   ### 6 legend
   axs[1,2].axis('off')
   axs[1,2].legend(wedges, ingredients,
             loc="center left",
             bbox_to_anchor=(0.01,0.5),ncol=2)

   plt.suptitle(ctname[i])

   plt.savefig(ctname[i]+".png",bbox_inches = 'tight',dpi=600)

B.png

第二版饼图 变聪明些,把一些重复的常量在开始设为变量,避免重复修改。将饼图内的百分比去掉,将百分比写在饼图外面

import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import datetime
import os
import time
import glob
import netCDF4 as nc
from netCDF4 import Dataset

# -*- coding: UTF-8 -*-

#mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['font.sans-serif']=['Times New Roman']
plt.rcParams['axes.unicode_minus'] = False


file_path=r'E:\ct.nc'
file = Dataset(file_path)
#file.variables

cas=(file.variables['cas'][:])  ##5*9*4 5ct*9var*4cs
ctr=(file.variables['ctr'][:])  ##5*9*23  5ct*9var*23dy
ctname=["B","S","J","Z","J"]
colors=["forestgreen","limegreen","red","salmon","darkblue","royalblue","deepskyblue","lightskyblue"]
nlim=400
fs=8
cc="b"
rr=0.5


def func2(pct, allvals, plist):
    tsum = np.sum(allvals)
    spct = pct*tsum/100
    for i, val in enumerate(allvals):
        #print(i,val,spct)
        if abs(spct - val) < 1.e-4:
            index = i
    
    if plist[index] <0 :
        spct = spct*(-1)
    
    #print(index,spct)
    return " ".format(spct)

for i in range(5):

   fig,axs = plt.subplots(nrows=2, ncols=3,figsize=(8, 7), dpi=300,subplot_kw=dict(aspect="equal"))
   plt.subplots_adjust(hspace=0.01,wspace = 0.05)
    #fig.subplots_adjust(bottom=0.1, right=0.8, top=0.9)
   plist1 = ctr[i,0:8,9]
   pabs1 = [ abs(x) for x in plist1 ]  #绝对值
   plist2 = ctr[i,0:8,10]
   pabs2 = [ abs(x) for x in plist2 ]  #绝对值
   plist3 = ctr[i,0:8,11]
   pabs3 = [ abs(x) for x in plist3 ]  #绝对值
   plist4 = ctr[i,0:8,12]
   pabs4 = [ abs(x) for x in plist4 ]  #绝对值
   plist5 = ctr[i,0:8,13]
   pabs5 = [ abs(x) for x in plist5 ]  #绝对值
   
   ingredients = ["MET","CP","PL","PR","LC","LTC","RTC","RLC"]

   ##绘图1
   
   wedges, texts, autotexts = axs[0,0].pie(pabs1, autopct=lambda x: func2(x, pabs1, plist1),labels=[str(int(x))+"%" for x in ctr[i,0:8,9]],
                                     textprops=dict(fontsize=fs,color=cc),radius=rr+ctr[i,8,9]/nlim,colors=colors)
   
   plt.setp(autotexts, size=8, weight="bold")
   axs[0,0].set_title("2017/12/26 \n PM$_2$$_.$$_5$  {:.0f}(μg/m$^3$)".format(ctr[i,8,9]))
   #axs[0,0].legend(wedges, ingredients,
   #          loc="center left",
   #          bbox_to_anchor=(0.18,1.29),ncol=4)
   
   
   #### 2
   wedges, texts, autotexts = axs[0,1].pie(pabs2, autopct=lambda x: func2(x, pabs2, plist2),labels=[str(int(x))+"%" for x in ctr[i,0:8,10]],
                                     textprops=dict(fontsize=fs,color=cc),radius=rr+ctr[i,8,10]/nlim,colors=colors)
   
   plt.setp(autotexts, size=8, weight="bold")
   axs[0,1].set_title("2017/12/27 \nPM$_2$$_.$$_5$  {:.0f}(μg/m$^3$)".format(ctr[i,8,10]))
   
   #### 3
   wedges, texts, autotexts = axs[0,2].pie(pabs3, autopct=lambda x: func2(x, pabs3, plist3),labels=[str(int(x))+"%" for x in ctr[i,0:8,11]],
                                     textprops=dict(fontsize=fs,color=cc),radius=rr+ctr[i,8,11]/nlim,colors=colors)
   
   plt.setp(autotexts, size=8, weight="bold")
   axs[0,2].set_title("2017/12/28 \n PM$_2$$_.$$_5$  {:.0f}(μg/m$^3$)".format(ctr[i,8,11]))

   ### 4
   wedges, texts, autotexts = axs[1,0].pie(pabs4, autopct=lambda x: func2(x, pabs4, plist4),labels=[str(int(x))+"%" for x in ctr[i,0:8,12]],
                                     textprops=dict(fontsize=fs,color=cc),radius=rr+ctr[i,8,12]/nlim,colors=colors)
   
   plt.setp(autotexts, size=8, weight="bold")
   axs[1,0].set_title("2017/12/29 \n PM$_2$$_.$$_5$  {:.0f}(μg/m$^3$)".format(ctr[i,8,12]))
   
   ### 5
   wedges, texts, autotexts = axs[1,1].pie(pabs5, autopct=lambda x: func2(x, pabs5, plist5),labels=[str(int(x))+"%" for x in ctr[i,0:8,13]],
                                     textprops=dict(fontsize=fs,color=cc),radius=rr+ctr[i,8,13]/nlim,colors=colors)
   
   plt.setp(autotexts, size=8, weight="bold")
   axs[1,1].set_title("2017/12/30 \n PM$_2$$_.$$_5$  {:.0f}(μg/m$^3$)".format(ctr[i,8,13]))
   
   ### 6 legend
   axs[1,2].axis('off')
   axs[1,2].legend(wedges, ingredients,
             loc="center left",
             bbox_to_anchor=(0.01,0.5),ncol=2)

   plt.suptitle(ctname[i])

   plt.savefig(ctname[i]+"3.png",bbox_inches = 'tight',dpi=600)
B3.png

相关文章

网友评论

      本文标题:python绘制饼图-有负值

      本文链接:https://www.haomeiwen.com/subject/schbhctx.html