标签: subplot

Matplotlib:获取子图填充数字

我想请求如何在将图像绘制为子图时覆盖默认的matplotlib行为的建议,其中子图大小似乎与图形大小不匹配.我想设置我的图形尺寸(例如,以匹配A4页面的宽度)并使子图自动拉伸以填充可用空间.在下面的示例中,下面的代码给出了一个在面板之间有很多空白区域的图形:

import numpy as np
import matplotlib.pyplot as plt

data=np.random.rand(10,4)

#creating a wide figure with 2 subplots in 1 row
fig,ax=plt.subplots(1,2, figsize=(9,3))  
ax=ax.reshape(1,len(ax))

for i in [0,1]:
    plt.sca(ax[0,i])
    plt.imshow(data,interpolation='nearest')
    plt.colorbar()
Run Code Online (Sandbox Code Playgroud)

我希望子图可以水平拉伸,以便填充图形空间.我将在每个轴上制作许多具有不同数值的相似图,并且图之间的空间似乎取决于x值与y值的比率,所以我想知道是否有一个很好的通用方法来设置子图宽度填充空间.可以以某种方式指定子图的物理尺寸吗?我一直在寻找解决方案几个小时,所以提前感谢您提供的任何帮助.

python matplotlib subplot

5
推荐指数
2
解决办法
1万
查看次数

无法绘制饼图的值计数

我编写了一个函数来绘制饼图中变量值的分布,如下所示。 我需要得到的饼图

def draw_piecharts(df, variables, n_rows, n_cols):
     df[variables].value_counts.plot(kind='pie', layout=(n_rows,n_cols), subplots=True)
     plt.show()
def main():
    util.draw_piecharts(df, [ 'TARGET', 'BanruptcyInd'], 1,2)
if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

不幸的是,我的函数无法计算,因为数据框没有attribute value_counts(),而value_counts是我知道如何获取饼图中的分布的唯一方法。以下是绘制的变量的示例:

0     0
1     0
2     0
3     0
4     0
5     0
6     0
7     0
8     0
9     0
10    0
11    0
12    1
13    0
14    0
15    0
16    0
17    1
18    0
19    0
20    0
21    1
22    0
23    0
24    1
25    0
26    1
27 …
Run Code Online (Sandbox Code Playgroud)

python dataframe pandas subplot pie-chart

5
推荐指数
1
解决办法
5363
查看次数

在 ImageGrid 中使用 basemap.pcolor 的空颜色条

以下代码生成我想要的图像,但颜色条为空白/白色,并且与数据不匹配:

def plot_array(da, ax=None, shift=True):
    """plots an array of lat by lon on a coastline map"""

    m = basemap.Basemap()
    m.drawcoastlines()
    m.pcolormesh(da.lon, y=da.lat, data=da.T, latlon=True)

    return m

# 'monthly mean' is an xarray DataArray

fig = plt.figure(0, (14, 8))
grid = ImageGrid(fig, 111, nrows_ncols=(3, 4), axes_pad=0.3,
                 cbar_mode='single', cbar_location="bottom",)
for i, m in enumerate(months):
    plt.sca(grid[i])
    plot_array(monthly_mean.sel(month=i + 1))
    plt.title(m)
plt.suptitle("{b} - {y} monthly means".format(b=benchmark, y=year))
# plt.colorbar()
plt.tight_layout()

os.makedirs("plots/monthly_means/{y}".format(y=year), exist_ok=True)
plt.savefig("plots/monthly_means/{y}/{b}_{y}.png".format(b=benchmark, y=year))
plt.close()
Run Code Online (Sandbox Code Playgroud)

空白颜色条

我还需要做些什么才能使颜色条与 ImageGrid 一起工作,还是 ImageGrid 和 Basemap 不能很好地协同工作?

python matplotlib subplot matplotlib-basemap

5
推荐指数
1
解决办法
1173
查看次数

用熊猫调整子图布局

我才明白,matplotlibtight_layout()不能被应用到所产生的地块大熊猫

这是我正在运行的代码:

            0         1         2         3         4
A    0.039895  0.960105       NaN       NaN       NaN
D    0.030418  0.969582       NaN       NaN       NaN
E    0.037345  0.962655       NaN       NaN       NaN
F    0.061522  0.938478       NaN       NaN       NaN
G    0.047163  0.952837       NaN       NaN       NaN
H    0.026423  0.000000  0.000000  0.973577       NaN

df.T.plot(kind='bar', subplots=True, width=0.7, legend=False, 
                             layout=(2,4), sharex=True, sharey=True)
plt.tight_layout()
Run Code Online (Sandbox Code Playgroud)

我最终遇到以下错误:

AttributeError: 'NoneType' object has no attribute 'is_bbox'
Run Code Online (Sandbox Code Playgroud)

我也相信,这与github上发布的类似问题有关: DataFrame.hist()与matplotlib.pyplot.tight_layout()不相处#9351

因此,我正在寻找基于的解决方法subplots_adjust(*args, **kwargs)。最重要的是,我试图调整hspace参数。但是,调用pandasplot函数时不接受这些关键字参数。

有什么建议么?

python matplotlib pandas subplot

5
推荐指数
1
解决办法
2729
查看次数

子图内的居中标题(matplotlib、pyplot)

我有一个大小相等的 3x2 网格。我使用命令

plt.suptitle("Awesome title")     # (1)
Run Code Online (Sandbox Code Playgroud)

在 6 个图上方有一个居中的标题。我使用命令

plt.title("Almost awesome title") # (2)
Run Code Online (Sandbox Code Playgroud)

对于每个子图上方的特定标题。现在是棘手的部分:我想要在子图的第一行和第二行之间有一个居中的标题。将 (2) 的位置参数操作为 (1.1 , 1.0) 之类的值后,我似乎无法获得格式正确/格式良好的图形。

TL; DR:我想要一个附加的plt.suptitle("Title"),如下图所示:(photoshopped)

任意图来说明子图中居中标题的点

matplotlib title python-2.7 subplot

5
推荐指数
1
解决办法
9136
查看次数

来自按级别分组的多索引pandas数据帧的子图

我如何基于多索引的一个级别从多索引的pandas DataFrame中做多个绘图?

我有一个模型的结果,在不同的场景中使用不同的技术,结果可能如下所示:

import numpy as np
import pandas as pd
df=pd.DataFrame(abs(np.random.randn(12,4)),columns=[2011,2012,2013,2014])
df['scenario']=['s1','s1','s1','s2','s2','s3','s3','s3','s3','s4','s4','s4']
df['technology'=['t1','t2','t5','t2','t6','t1','t3','t4','t5','t1','t3','t4']
dfg=df.groupby(['scenario','technology']).sum().transpose()
Run Code Online (Sandbox Code Playgroud)

dfg将拥有每年针对每种方案使用的技术.我想为每个分享图例的场景设一个子图.

如果我只是使用参数subplots = True,那么它会绘制所有可能的组合(12个子图)

dfg.plot(kind='bar',stacked=True,subplots=True)
Run Code Online (Sandbox Code Playgroud)

基于这种反应,我更接近我所寻找的.

f,a=plt.subplots(2,2)

fig1=dfg['s1'].plot(kind='bar',ax=a[0,0])

fig2=dfg['s2'].plot(kind='bar',ax=a[0,1])

fig2=dfg['s3'].plot(kind='bar',ax=a[1,0])

fig2=dfg['s3'].plot(kind='bar',ax=a[1,1])

plt.tight_layout()
Run Code Online (Sandbox Code Playgroud)

但结果并不理想,每个子情节都有不同的传说......这使得它很难阅读.必须有一种更简单的方法从多索引的数据帧中进行子图...谢谢!

EDIT1:Ted Petrou使用seaborn factorplot提出了一个很好的解决方案,但我有两个问题.我已经定义了一个样式,我宁愿不使用seaborn样式(一个解决方案可以改变seaborn的参数).另一个问题是我想使用堆积条形图,这需要相当多的额外调整.我可以用Matplotlib做类似的事吗?

python matplotlib multi-index pandas subplot

5
推荐指数
1
解决办法
1799
查看次数

用 for 循环生成多个图;在 matplotlib 子图中显示输出

目标:使用 for 循环生成 100 个条形图,并将输出显示为子图图像

数据格式:具有 101 列的数据文件。最后一列是 X 变量;剩下的 100 列是 Y 变量,针对这些变量绘制了 x。

所需输出:5 x 20 子图阵列中的条形图,如本示例图像所示:子图 - 3 x 2 数组示例

当前方法:我一直在 seaborn 中使用 PairGrid,它生成一个 nx 1 数组:示例输出.

其中输入==数据帧;input3 == 调用列标题的列表:

for i in input3:
    plt.figure(i)
    g = sns.PairGrid(input,
             x_vars=["key_variable"],
             y_vars=i,
             aspect=.75, size=3.5)
    g.map(sns.barplot, palette="pastel")
Run Code Online (Sandbox Code Playgroud)

有没有人有任何想法如何解决这个问题?

python for-loop matplotlib batch-processing subplot

5
推荐指数
1
解决办法
5962
查看次数

Matplotlib 在所有子图上显示 x-ticks 和唯一的 y 标签

我正在绘制共享相同 x 轴的两个子图,但是当我绘制时,我只看到第二个子图上的 x 轴刻度。如何使两个子图上的 x-ticks 都可见?

此外,我想为两个子图设置 y 标签,但只有第二个可见。你能帮忙在两个子图上显示 y 标签吗?

下面是我的可重现代码。

#!/usr/bin/python3
import pandas as pd
desired_width = 1500
pd.set_option('display.width', desired_width)
import matplotlib.pyplot as plt
import numpy as np


df = pd.DataFrame([{'DATETIME': '2017-09-29 01:00,', 'Population': 1000, 'Temp': 90, 'State': 'California'},
                   {'DATETIME': '2017-09-29 01:00,', 'Population': 2000, 'Temp': 70, 'State': 'Illinois'},
                   {'DATETIME': '2017-09-29 01:00,', 'Population': 3000, 'Temp': 50, 'State': 'Georgia'},
                   {'DATETIME': '2017-09-29 02:00,', 'Population': 2000, 'Temp': 40, 'State': 'California'},
                   {'DATETIME': '2017-09-29 02:00,', 'Population': 6000, 'Temp': 20, 'State': 'Illinois'},
                   {'DATETIME': '2017-09-29 …
Run Code Online (Sandbox Code Playgroud)

python matplotlib pandas subplot

5
推荐指数
2
解决办法
1万
查看次数

清除Matplotlib中的子图

我有一些图中的子图fig1,通过创建

ax = fig1.add_subplot(221)
Run Code Online (Sandbox Code Playgroud)

然后,我通过每个子图绘制内容

im=ax.plot(x,y)
Run Code Online (Sandbox Code Playgroud)

并通过添加一些轴标签

ax.set_xlabel('xlabel')
Run Code Online (Sandbox Code Playgroud)

然后我想完全清除一个特定的子图,如何使用cla(),clf()或close()来清除matplotlib中的图?.然而问题是,ax.cla()并且ax.clear()似乎只清除了绘图中的数据,而没有移除轴,轴刻度标签等.另一方面plt.clf()清除整个图形.介于两者之间吗?类似clf的命令可以清除子图中的所有内容,包括轴标签?或者我只是以错误的方式使用命令?

matplotlib subplot

5
推荐指数
1
解决办法
7604
查看次数

将 seaborn.palplot 轴添加到现有图形中以可视化不同的调色板

将 seaborn 图形添加到子图中通常是通过在创建图形时传递 'ax'完成的。例如:

sns.kdeplot(x, y, cmap=cmap, shade=True, cut=5, ax=ax)
Run Code Online (Sandbox Code Playgroud)

但是,此方法不适用于seaborn.palplot,它可视化 seaborn 调色板。我的目标是创建一个不同调色板的图形,用于可扩展的颜色比较和演示。此图像粗略地显示了我正在尝试创建的图 []。

一个可能相关的答案描述了一种创建 seaborn 图形并将轴复制到另一个图形的方法。我一直无法将这种方法应用于 palplot 图形,并且想知道是否有一种快速的方法可以将它们强制转换为现有图形。

这是我的最小工作示例,现在仍在生成单独的数字。

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

fig1 = plt.figure()
length, n_colors = 12, 50  # amount of subplots and colors per subplot
start_colors = np.linspace(0, 3, length)
for i, start_color in enumerate(start_colors):
    ax = fig1.add_subplot(length, 1, i + 1)
    colors = sns.cubehelix_palette(n_colors=n_colors, …
Run Code Online (Sandbox Code Playgroud)

python matplotlib color-palette subplot seaborn

5
推荐指数
1
解决办法
795
查看次数