pandas 改善子图大小/间距,有许多子图

rkkpypqq  于 2023-05-21  发布在  其他
关注(0)|答案(9)|浏览(170)

我需要在matplotlib中生成一大堆垂直堆叠的图。结果将使用savefig保存并在网页上查看,所以我不在乎最终图像有多高,只要子图间隔开,使它们不重叠。
不管我允许这个数字有多大,次要情节似乎总是重叠的。
我的代码目前看起来像

import matplotlib.pyplot as plt
import my_other_module

titles, x_lists, y_lists = my_other_module.get_data()

fig = plt.figure(figsize=(10,60))
for i, y_list in enumerate(y_lists):
    plt.subplot(len(titles), 1, i)
    plt.xlabel("Some X label")
    plt.ylabel("Some Y label")
    plt.title(titles[i])
    plt.plot(x_lists[i],y_list)
fig.savefig('out.png', dpi=100)
67up9zun

67up9zun1#

请查看matplotlib: Tight Layout guide并尝试使用matplotlib.pyplot.tight_layoutmatplotlib.figure.Figure.tight_layout
举个简单的例子:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=4, ncols=4, figsize=(8, 8))
fig.tight_layout() # Or equivalently,  "plt.tight_layout()"

plt.show()

无紧密布局

紧凑布局

n7taea2i

n7taea2i2#

您可以使用plt.subplots_adjust更改子图之间的间距。
调用签名:

subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)

参数含义(和建议的默认值)为:

left  = 0.125  # the left side of the subplots of the figure
right = 0.9    # the right side of the subplots of the figure
bottom = 0.1   # the bottom of the subplots of the figure
top = 0.9      # the top of the subplots of the figure
wspace = 0.2   # the amount of width reserved for blank space between subplots
hspace = 0.2   # the amount of height reserved for white space between subplots

实际的默认值由rc文件控制

jvlzgdj9

jvlzgdj93#

使用subplots_adjust(hspace=0)或非常小的数字(hspace=0.001)将完全删除子图之间的空白,而hspace=None则不会。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as tic

fig = plt.figure(figsize=(8, 8))

x = np.arange(100)
y = 3.*np.sin(x*2.*np.pi/100.)

for i in range(1, 6):
    temp = 510 + i
    ax = plt.subplot(temp)
    plt.plot(x, y)
    plt.subplots_adjust(hspace=0)
    temp = tic.MaxNLocator(3)
    ax.yaxis.set_major_locator(temp)
    ax.set_xticklabels(())
    ax.title.set_visible(False)

plt.show()

hspace=0hspace=0.001

hspace=None

lnvxswe2

lnvxswe24#

tight_layout类似,matplotlib现在(从2.2版开始)提供了constrained_layout。与tight_layout相反,constrained_layout是一个属性,它可以是活动的,并在每个绘制步骤之前优化布局。
因此,它需要在子图创建之前或期间激活,例如figure(constrained_layout=True)subplots(constrained_layout=True)
示例:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(4,4, constrained_layout=True)

plt.show()

constrained_layout也可以通过rcParams设置

plt.rcParams['figure.constrained_layout.use'] = True

请参阅“What's New”条目和Constrained Layout Guide

zqdjd7g9

zqdjd7g95#

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(10,60))
plt.subplots_adjust( ... )

plt.subplots_adjust方法:

def subplots_adjust(*args, **kwargs):
    """
    call signature::

      subplots_adjust(left=None, bottom=None, right=None, top=None,
                      wspace=None, hspace=None)

    Tune the subplot layout via the
    :class:`matplotlib.figure.SubplotParams` mechanism.  The parameter
    meanings (and suggested defaults) are::

      left  = 0.125  # the left side of the subplots of the figure
      right = 0.9    # the right side of the subplots of the figure
      bottom = 0.1   # the bottom of the subplots of the figure
      top = 0.9      # the top of the subplots of the figure
      wspace = 0.2   # the amount of width reserved for blank space between subplots
      hspace = 0.2   # the amount of height reserved for white space between subplots

    The actual defaults are controlled by the rc file
    """
    fig = gcf()
    fig.subplots_adjust(*args, **kwargs)
    draw_if_interactive()

fig = plt.figure(figsize=(10,60))
fig.subplots_adjust( ... )

图片的大小很重要。
“我尝试过打乱hspace,但增加它似乎只能使所有的图更小,而不能解决重叠问题。
因此,为了制造更多的白色空间并保持子情节大小,总图像需要更大。

mnemlml8

mnemlml86#

你可以试试.subplot_tool()

plt.subplot_tool()
sxpgvts3

sxpgvts37#

  • 使用pandas.DataFrame.plot绘制 Dataframe 时解决此问题,该 Dataframe 使用matplotlib作为默认后端。
  • 以下适用于指定的kind=(例如'bar''scatter''hist'等)。
    *python 3.8.12pandas 1.3.4matplotlib 3.4.3中测试

导入和样本数据

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# sinusoidal sample data
sample_length = range(1, 15+1)
rads = np.arange(0, 2*np.pi, 0.01)
data = np.array([np.sin(t*rads) for t in sample_length])
df = pd.DataFrame(data.T, index=pd.Series(rads.tolist(), name='radians'), columns=[f'freq: {i}x' for i in sample_length])

# default plot with subplots; each column is a subplot
axes = df.plot(subplots=True)

调整间距

1.调整pandas.DataFrame.plot中的默认参数
1.更改figsize:对于每个子图,宽度为5且高度为4是开始的好地方。
1.更改layout:(行、列)用于子图的布局。

  1. sharey=Truesharex=True,因此每个子图上的冗余标签不会占用空间。
  2. .plot方法返回一个matplotlib.axes.Axes的numpy数组,应该将其展平以便于使用。
    1.使用.get_figure()从其中一个Axes中提取DataFrame.plot图形对象。
    1.如果需要,使用fig.tight_layout()
axes = df.plot(subplots=True, layout=(3, 5), figsize=(25, 16), sharex=True, sharey=True)

# flatten the axes array to easily access any subplot
axes = axes.flat

# extract the figure object
fig = axes[0].get_figure()

# use tight_layout
fig.tight_layout()

df

# display(df.head(3))
         freq: 1x  freq: 2x  freq: 3x  freq: 4x  freq: 5x  freq: 6x  freq: 7x  freq: 8x  freq: 9x  freq: 10x  freq: 11x  freq: 12x  freq: 13x  freq: 14x  freq: 15x
radians                                                                                                                                                            
0.00     0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000
0.01     0.010000  0.019999  0.029996  0.039989  0.049979  0.059964  0.069943  0.079915  0.089879   0.099833   0.109778   0.119712   0.129634   0.139543   0.149438
0.02     0.019999  0.039989  0.059964  0.079915  0.099833  0.119712  0.139543  0.159318  0.179030   0.198669   0.218230   0.237703   0.257081   0.276356   0.295520
cwtwac6a

cwtwac6a8#

import matplotlib.pyplot as plt

# create the figure with tight_layout=True
fig, axes = plt.subplots(nrows=4, ncols=4, figsize=(8, 8), tight_layout=True)

ezykj2lf

ezykj2lf9#

如果将tight_layout=True传递到plt.subplots()fig.tight_layout()不能在子图之间增加足够的间距,请考虑使用tight_layout(pad=2.0)这样的焊盘进行调整以获得所需的间距。

相关问题