第一版饼图 可实现功能:循环出带负值的饼图
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)
![](https://img.haomeiwen.com/i12827629/cce0dcb314ced9b3.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)
![](https://img.haomeiwen.com/i12827629/f8196a96a5228758.png)
网友评论