matplotlib饼图百分比可视化

填写自己的mysql连接方式和sql语句即可实现饼图带百分比,线长度自己可以调参数
import pymysql
from matplotlib import pyplot as plt

import numpy as np

class mysql_func():
配置mysql数据库连接池
def init(self, host=”, user=”, password=”, port=, database=”,
charset=”):
self.host = host
self.user = user
self.password = password
self.port = port
self.database = database
self.charset = charset
self.db = pymysql.connect(host=host, user=user, password=password, port=port, database=database,
charset=charset)

取数据,tuple类型返回
def get_data(self, sql):
    self.curors = self.db.cursor()
    self.curors.execute(sql)
    self.db.commit()
    data = self.curors.fetchall()
    self.curors.close()
    return data

存数据,int类型返回成功条数
def get_row_number(self, sql, data=None):
    self.curors = self.db.cursor()
    if data is None or len(data) == 0:
        self.curors.execute(sql)
    else:
        if type(data[0]) != type([]):
            data = [data]
        self.curors.executemany(sql, data)
    self.db.commit()
    data = self.curors.rowcount
    self.curors.close()
    return data

取数据,[dict]类型返回
def get_json(self, sql):
    self.curors = self.db.cursor()
    self.curors.execute(sql)
    self.db.commit()
    columns = [col[0] for col in self.curors.description]
    data = [dict(zip(columns, row)) for row in self.curors.fetchall()]
    self.curors.close()
    return data

def academic_co_country_img():
mysql_aliyun = mysql_func(host=”, user=”, password=”, port=,
database=”)
sql = ”””
country_data = mysql_aliyun.get_data(sql)
print(country_data)
fig, ax = plt.subplots(figsize=(10, 6), subplot_kw=dict(aspect=”equal”))
size = 0.3
vals = np.array([[k[1],0] for k in country_data])
print(vals.sum())
ingredients = [k[0] for k in country_data]
print(ingredients)
recipe = []
for k in country_data:
recipe.append(k[1]/vals.sum())
recipe.append(format(k[1]/vals.sum(),’.1%’))
print(recipe)
new_ingredients = []
for l in range(len(ingredients)):
new_ingredients.append(ingredients[l] + ” ” + str(format(recipe[l],’.1%’)))
print(new_ingredients)

new_data = []
qita_num = 0
data = [k[1] for k in country_data]
if len(data) >= 10:
    for d in range(len(data)):
        if d > 9:
            new_data.append(data[d])
            qita_num += data[d]
    new_data.append(qita_num)
else:
    new_data = data
print(new_data,"************************")
wedges, texts = ax.pie(data, wedgeprops=dict(width=0.3), startangle=-40)
ax.legend(new_ingredients, title="", loc="upper left", bbox_to_anchor=(1, 0, 0.5, 1), )

每一类别说明框
boxstyle框的类型,fc填充颜色,ec边框颜色,lw边框宽度
bbox_props = dict(boxstyle="square,pad=0.3", fc='white', ec="white", lw=0.72)
设置框引出方式
kw = dict(arrowprops=dict(arrowstyle="-"),
          bbox=bbox_props, zorder=0, va="center")

添加标签
ta = 1.4
for i, p in enumerate(wedges):
    # if recipe[i] >= 0.03:
    if i < 10:
        ang = (p.theta2 - p.theta1) / 2. + p.theta1
        y = np.sin(np.deg2rad(ang))
        x = np.cos(np.deg2rad(ang))
        # &#x8BBE;&#x7F6E;&#x65B9;&#x5411;
        horizontalalignment = {-1: "right", 1: "left"}[int(np.sign(x))]
        connectionstyle = "angle,angleA=0,angleB={}".format(ang)
        kw["arrowprops"].update({"connectionstyle": connectionstyle})
        #&#x8BBE;&#x7F6E;&#x6807;&#x6CE8; &#x8FD9;&#x4E00;&#x6B65;&#x53EF;&#x4EE5;&#x8C03;&#x6574;&#x997C;&#x56FE;&#x7684;&#x7EBF;
        ax.annotate(format(recipe[i],'.1%'), xy=(x, y), xytext=(1.35 * np.sign(x), 1.4 * y),
                    horizontalalignment=horizontalalignment, color='black', **kw)
        ta -= 0.3

ax.set_title("    ")

plt.show()
'''
cmap = plt.get_cmap("tab20c")
outer_colors = cmap(np.arange(3) * 4)

wedges = ax.pie(vals.sum(axis=1), wedgeprops=dict(width=0.5), startangle=-40, autopct='%.1f%%',radius=1, pctdistance=1.2, labeldistance=1.2)

ax.legend(ingredients, title="", loc="upper left", bbox_to_anchor=(1, 0, 0.5, 1),)

ax.set(aspect="equal", title='')
plt.show()
'''

if name == ‘ main‘:
academic_co_country_img()

Original: https://blog.csdn.net/weixin_47376764/article/details/121669552
Author: 大数据追随者
Title: matplotlib饼图百分比可视化

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/766270/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球