Python Matplotlib饼图作为散点图

Python Matplotlib饼图作为散点图,python,pandas,matplotlib,Python,Pandas,Matplotlib,我有一个有趣的问题,我试图使用多个matplotlib饼图作为散点图。我已经阅读了关于matplotlib教程的内容,并且能够使这些内容正常工作。然而,我发现我能够使用内置的饼图函数并在同一轴上绘制许多饼图来获得相同的结果 当使用此替代方法时,我发现在绘制饼图后,轴会丢失其标签,并且每当平移原始数据时,原始数据仍包含在原始数据的边界所在的区域内,但饼图仅包含在图形画布内 下面的代码复制了我遇到的问题 import matplotlib.pyplot as plt import pandas as

我有一个有趣的问题,我试图使用多个matplotlib饼图作为散点图。我已经阅读了关于matplotlib教程的内容,并且能够使这些内容正常工作。然而,我发现我能够使用内置的饼图函数并在同一轴上绘制许多饼图来获得相同的结果

当使用此替代方法时,我发现在绘制饼图后,轴会丢失其标签,并且每当平移原始数据时,原始数据仍包含在原始数据的边界所在的区域内,但饼图仅包含在图形画布内

下面的代码复制了我遇到的问题

import matplotlib.pyplot as plt
import pandas as pd
import random

def rand(): #simulate some random data
    return [random.randint(0,100) for _ in range(10)]

def plot_pie(x, ax): 
    ax.pie(x[['a','b','c']], center=(x['lat'],x['lon']), radius=1,colors=['r', 'b', 'g'])

#my data is stored in a similar styled dataframe that I read from a csv and the data is static
sim_data = pd.DataFrame({'a':rand(),'b':rand(),'c':rand(), 'lat':rand(),'lon':rand()})

fig, ax = plt.subplots()
plt.scatter(x=sim_data['lat'], y=sim_data['lon'], s=1000, facecolor='none',edgecolors='r')
y_init = ax.get_ylim()
x_init = ax.get_xlim()

sim_data.apply(lambda x : plot_pie(x,ax), axis=1)
ax.set_ylim(y_init)
ax.set_xlim(x_init)
plt.show()
我重置轴的x和y限制的原因是,我假设pie函数自动将轴的边界设置为最后一个饼图,这是我的工作

更新

再次阅读文档后,我发现matplotlib饼图对象作为默认对象设置为不剪裁到任何轴的范围。为了解决这个问题,仅仅更新这个参数似乎对我有效。以下代码是我的问题的解决方案。我还发现,通过绘制每个饼图,我将丢失轴刻度,为了解决这个问题,我必须将frame参数传递给饼图

def plot_pie(x, ax):
    ax.pie(x[['a','b','c']], center=(x['lat'],x['lon']), radius=1,colors=['r', 'b', 'g'], wedgeprops={'clip_on':True}, frame=True)

生成的数据与原始帖子中的数据相同。为了清晰起见,我为每个情节添加了一个框架

def plot_pie(x,ax,r=1):
#散点图上点图大小的半径
x.pie(x['a','b','c']],中心=(x['lat'],x['lon']),半径=r,颜色=['r','b','g'])
图,axs=plt.子批次(1,3,figsize=(15,5))
图贴片设置面颜色(“白色”)
#原图
ax=axs[0]
最大散射(x=sim_数据['lat'],y=sim_数据['lon'],s=1000,facecolor='none',EdgeColor='r')
y_init=ax.get_ylim()
x_init=ax.get_xlim()
sim_data.apply(λx:plot_pie(x,ax),轴=1)
ax.set_ylim(y_init)
ax.set\u xlim(x\u init)
ax.集合标题(“原件”)
ax.设置帧为on(真)
#r-初学者解答
ax=axs[1]
最大散射(x=sim_数据['lat'],y=sim_数据['lon'],s=1000,facecolor='none',EdgeColor='r')
y_init=ax.get_ylim()
x_init=ax.get_xlim()
sim_data.apply(λx:plot_pie(x,ax),轴=1)
ax.set_ylim([0,y_init[1]*1.1])
ax.set_xlim([0,x_init[1]*1.1])
ax.set_标题(“r-初学者”)
ax.设置帧为on(真)
#我的解决方案
ax=axs[2]
#不要使用`s=`表示大小,当您分散打印时,它将无法正常工作
#因为这些图将在它们上面绘制
最大散射(x=sim_数据['lat'],y=sim_数据['lon'],s=0)
#轴的git最小/最大值
y_init=ax.get_ylim()
x_init=ax.get_xlim()
模拟数据应用(λx:曲线图(x,ax,r=7),轴=1)
#使用步骤10从零到xlim/ylim
_=ax.yaxis.set_ticks(范围(0,圆形(y_init[1])+10,10))
_=ax.xaxis.set_ticks(范围(0,圆形(x_init[1])+10,10))
_=ax.set_title('My')
ax.设置帧为on(真)

我尝试这样做的唯一原因是,我的任务是为基于代理的模型构建GUI,并被要求尝试在POI处放置一个饼图,表示每个代理的状态。我同意这可能是个坏主意,因为ax.set_ylim(y_int[0]-10,y_init[1]+10);ax.set_xlim(x_init[0]-10,y_init[1]+10)如何扩展图形的绘图区域?如果我的猜测正确,请给我回信,或者在某个地方发布一张带有所需结果的图像。@r初学者可以工作,如果你只想在图形上保留所有的大标记