【问题标题】:Python plot multiple circle on grid with legendPython在带有图例的网格上绘制多个圆圈
【发布时间】:2017-03-10 14:54:38
【问题描述】:

我想在 N x M 的网格上绘制各种颜色和相同大小的圆圈。在 x,y 位置,可以是一个圆圈或什么都不是。

我希望每列都有一个 x 标签(这里是一周)和一个 ylabel(这里是一个主题)。

目前,我找到了一种使用子图绘制圆圈的方法,但我无法获得文本和网格。

这是我绘制圆圈的代码:

import matplotlib.pyplot as plt
from matplotlib.patches import Wedge
from plotly.graph_objs import *
from matplotlib.gridspec import GridSpec

def dual_half_circle(center, radius, angle=0, ax=None, colors=('w','k'), **kwargs):
    """
    Add two half circles to the axes *ax* (or the current axes) with the 
    specified facecolors *colors* rotated at *angle* (in degrees).
    """
    if ax is None:
        ax = plt.gca()
    kwargs.update(transform=ax.transAxes, clip_on=False)
    theta1, theta2 = angle, angle + 180
    w1 = Wedge(center, radius, theta1, theta2, fc=colors[0], **kwargs)
    w2 = Wedge(center, radius, theta2, theta1, fc=colors[1], **kwargs)
    for wedge in [w1, w2]:
        ax.add_artist(wedge)
    return [w1, w2]

这是显示所有内容的代码(我删除了颜色条件):

DF = pd.DataFrame(np.random.choice([True, False], size = (15, 10)))

fig, ax = plt.subplots()
for ii in range(0,DF.shape[1]):    
    for jj in range(0,DF.shape[0]):
        if DF[ii][jj]:
            dual_half_circle((ii, -1*jj), radius=0.3, colors=('b','g'), angle=90, ax=ax)
            ax.axis('equal')

for ii in range(0,DF.shape[1]):       
    plt.annotate(xy= (ii, 1), s= 'W'+str(ii), fontsize = 100, verticalalignment='center', horizontalalignment='center')

for jj in range(0,DF.shape[0]):
    plt.annotate(xy =(-1, -1*jj),s= 'subj '+str(jj), fontsize = 100, verticalalignment='center', horizontalalignment='center')

plt.show()

这是结果,我没有注释也没有网格

Result

我是否应该从子情节更改为经典情节才能添加我想要的内容? 感谢您的帮助!

【问题讨论】:

  • 这里有什么理由不显示minimal reproducible example 吗?你说的网格是什么意思?是不是你用plt.grid() 得到的,如果不是,解释你的意思。删除plt.axis("off")这一行时是否得到了想要的结果?
  • 抱歉,我修改了帖子...plt.axis("off") 允许删除绘图左上角的小网格,这不是我想要的网格。我希望在子图之间有一些水平和垂直线,但不是带有轴的 x,y 网格。

标签: python matplotlib annotations grid subplot


【解决方案1】:

试试下面的。 (我还是不明白网格的东西,所以我把它省略了)

import matplotlib.pyplot as plt
from matplotlib.patches import Wedge
import pandas as pd
import numpy as np


def dual_half_circle(center, radius, angle=0, ax=None, colors=('w','k'), **kwargs):
    """
    Add two half circles to the axes *ax* (or the current axes) with the 
    specified facecolors *colors* rotated at *angle* (in degrees).
    """
    if ax is None:
        ax = plt.gca()
    theta1, theta2 = angle, angle + 180
    w1 = Wedge(center, radius, theta1, theta2, fc=colors[0], **kwargs)
    w2 = Wedge(center, radius, theta2, theta1, fc=colors[1], **kwargs)
    for wedge in [w1, w2]:
        ax.add_artist(wedge)
    return [w1, w2]

DF = pd.DataFrame(np.random.choice([True, False], size = (15, 10)))

fig, ax = plt.subplots(figsize=(8,13))
for ii in range(0,DF.shape[1]):    
    for jj in range(0,DF.shape[0]):
        if DF[ii][jj]:
            dual_half_circle((ii, -1*jj), radius=0.3, colors=('b','g'), angle=90, ax=ax)
            ax.axis('equal')

for ii in range(0,DF.shape[1]):       
    plt.annotate(xy= (ii, 1), s= 'W'+str(ii), fontsize = 10, verticalalignment='center', horizontalalignment='center')

for jj in range(0,DF.shape[0]):
    plt.annotate(xy =(-1, -1*jj),s= 'subj '+str(jj), fontsize =10, verticalalignment='center', horizontalalignment='right')

ax.set_xlim(-1,10)
ax.set_ylim(-15,3)
plt.axis("off")
plt.plot([-1,10], [-15,3], alpha=0)
plt.tight_layout()
plt.show()

【讨论】:

  • 非常感谢您运行良好。只是为了理解,你为什么放figsize=(8,13)?这些值有什么特定的吗?而且我所说的网格只是一种将所有圆圈放在某种表格中以便更好阅读的方法。
  • 如果要绘制的数组的形状为(y,x)(此处为(15, 10)),那么选择图形大小figsize = (w, h),其中w/x ~= h/y 对我来说似乎很自然。但任何数字大小都可以。
  • 并以网格的想法结束,我使用段解决了它:` for ii in range(0,DF.shape[1]-1): plt.plot([ii+0.5, ii+0.5], [-1*(DF.shape[0]-0.5), 0.5], color='k', linestyle='dotted', linewidth=grid_width)` 和for jj in range(1,DF.shape[0]): plt.plot([-0.5, DF.shape[1]-0.5], [-1*jj+0.5, -1*jj+0.5], color='k', linestyle='dotted', linewidth=grid_width)
猜你喜欢
  • 1970-01-01
  • 2014-06-02
  • 1970-01-01
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
  • 2013-12-02
  • 1970-01-01
相关资源
最近更新 更多