我想请求如何在将图像绘制为子图时覆盖默认的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值的比率,所以我想知道是否有一个很好的通用方法来设置子图宽度填充空间.可以以某种方式指定子图的物理尺寸吗?我一直在寻找解决方案几个小时,所以提前感谢您提供的任何帮助.
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) 以下代码生成我想要的图像,但颜色条为空白/白色,并且与数据不匹配:
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 不能很好地协同工作?
我才明白,matplotlib的tight_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函数时不接受这些关键字参数。
有什么建议么?
我有一个大小相等的 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)
我如何基于多索引的一个级别从多索引的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做类似的事吗?
目标:使用 for 循环生成 100 个条形图,并将输出显示为子图图像
数据格式:具有 101 列的数据文件。最后一列是 X 变量;剩下的 100 列是 Y 变量,针对这些变量绘制了 x。
所需输出:5 x 20 子图阵列中的条形图,如本示例图像所示:
当前方法:我一直在 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)
有没有人有任何想法如何解决这个问题?
我正在绘制共享相同 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) 我有一些图中的子图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的命令可以清除子图中的所有内容,包括轴标签?或者我只是以错误的方式使用命令?
将 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) subplot ×10
matplotlib ×9
python ×8
pandas ×4
dataframe ×1
for-loop ×1
multi-index ×1
pie-chart ×1
python-2.7 ×1
seaborn ×1
title ×1