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))
        # 设置方向
        horizontalalignment = {-1: "right", 1: "left"}[int(np.sign(x))]
        connectionstyle = "angle,angleA=0,angleB={}".format(ang)
        kw["arrowprops"].update({"connectionstyle": connectionstyle})
        #设置标注 这一步可以调整饼图的线
        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()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值