标签: subplot

为什么 matplotlib ax.transData.transform 在不同的 ipython 单元格中给出不同的值?如何解决这个问题?

我在 ipython 中遇到了 matplotlib 的一个非常奇怪的问题ax.transData.transform。基本上,在fig, ax = plt.subplots()声明的单元格中,运行ax.transData.transform或轴是不正确的。但是,如果您在后面的单元格中运行,它将返回正确的值。xyax.transData.transform

为了演示,下面是在声明的单元格中运行转换的代码fig, ax = plt.subplots()

fig, ax = plt.subplots()
ax.set_aspect('equal')
ax.set_ylim(-2,2)
ax.set_xlim(-5,5)
nsize=[x*100 for x in d]
yradius = (ax.transData.transform([(0,2)]) - ax.transData.transform([(0,1)]))[0,1]
print("yRadius: {}".format(yradius))
xradius = (ax.transData.transform([(2,0)]) - ax.transData.transform([(1,0)]))[0,0]
print("xRadius: {}".format(xradius))
Run Code Online (Sandbox Code Playgroud)

打印输出是

yRadius: 54.360000000000014
xRadius: 33.48000000000002
Run Code Online (Sandbox Code Playgroud)

在上述单元格下方的单元格中,如果我运行

yradius = (ax.transData.transform([(0,2)]) - ax.transData.transform([(0,1)]))[0,1]
print("yRadius: {}".format(yradius))
xradius = (ax.transData.transform([(2,0)]) - ax.transData.transform([(1,0)]))[0,0]
print("xRadius: {}".format(xradius))
Run Code Online (Sandbox Code Playgroud)

输出是

yRadius: 33.48000000000002
xRadius: 33.48000000000002
Run Code Online (Sandbox Code Playgroud)

为什么两个单元格的值不一样?尽管xRadius第一个单元格的 与底部单元格的值匹配,但yRadius是关闭的。我认为底部单元格的值是正确的,因为由于 …

transform axes matplotlib ipython subplot

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

如何设置 pyplot 子图的 xticks 和字体属性?

我试图绘制表情符号在不同类型的推文(“正常”推文、转发和回复)中的使用频率。为此,我使用 TwitterColorEmoji-SVGinOT (链接)字体来渲染表情符号的 Unicode,我使用plt.xticks()将其作为 xticks 标签放置。但是,它仅正确设置了最后一个子图的 xticks(参见下图)。

我怎样才能对所有子图做同样的事情?

这是我用来生成绘图的代码。

import matplotlib.font_manager as fm
from matplotlib import ft2font
from matplotlib.font_manager import ttfFontProperty

def print_emoji_freq(emoji_freqs, ax, fontprop):

    emojis = list(zip(*emoji_freqs))[0]
    scores = list(zip(*emoji_freqs))[1]
    x_pos = np.arange(len(emojis))

    ax.bar(x_pos, scores, align='center')
    plt.xticks(x_pos, emojis, fontproperties=fontprop)

    ax.set_xticks(x_pos)
    ax.set_ylabel('Popularity Score')

fpath = '/home/mattia/.local/share/fonts/TwitterColorEmoji-SVGinOT.ttf'
fprop = fm.FontProperties(fname=fpath)

font = ft2font.FT2Font(fpath)
fprop = fm.FontProperties(fname=fpath)

ttfFontProp = ttfFontProperty(font)

fontprop = fm.FontProperties(family='sans-serif',
                            fname=ttfFontProp.fname,
                            size=25,
                            stretch=ttfFontProp.stretch,
                            style=ttfFontProp.style,
                            variant=ttfFontProp.variant,
                            weight=ttfFontProp.weight)

fig, ax = plt.subplots(1, 3, figsize=(18,4))

print_emoji_freq(st_emojis, ax[0], fontprop) …
Run Code Online (Sandbox Code Playgroud)

python matplotlib subplot

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

如何在一个图中绘制极坐标和笛卡尔子图,如图所示

我想生成一个半笛卡尔半极坐标图。例如,高斯曲线的一半采用极坐标格式,另一半采用笛卡尔格式。哪个是最好的方法?

半笛卡尔半极坐标图

我尝试过共享 y 轴,但未能成功为一个图采用两种不同类型的格式。

import matplotlib.pyplot as plt
import numpy as np

theta = np.linspace(0,(np.pi)/2)
r = np.sin(theta)

fig = plt.figure()
ax = fig.add_subplot(211, polar=True)
c = ax.scatter(theta, r, c=r, s=5, cmap='hsv', alpha=0.85)

ax.set_thetamin(0)
ax.set_thetamax(90)

ax1=fig.add_subplot(212) #, sharey='ax')
fig, (c, d) = plt.subplots(ncols=2,sharey=True)
d=ax1.scatter(theta,r)
plt.show() 
Run Code Online (Sandbox Code Playgroud)

matplotlib cartesian subplot polar-coordinates

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

Seaborn 直方图/显示子图

我有一个数据框 df,它在一段时间内对多种“N”货币具有不同的汇率。

date         pair       rate
2019-05-01   AUD/USD   -0.004
2019-05-01   GBP/USD    0.05
2019-05-01   USD/NOK    0.0002      
...
2020-01-01   AUD/USD   -0.025
2020-01-01   GBP/USD    0.021315
2020-01-01   USD/NOK    0.0045
Run Code Online (Sandbox Code Playgroud)

我想使用 Seaborn sns 循环绘制 N 个直方图(每对一个);添加标题名称,说明每个图上的对名称。

我可以使用简单的 groupby 来实现这些图:

df.groupby('pair').hist(bins=20, normed=True)
plt.show()
Run Code Online (Sandbox Code Playgroud)

然而,这并没有给我单独的标题,我想为情节添加更多功能。

python histogram pandas subplot seaborn

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

将线图添加到 Facetgrid 图中

RelPlot使用 Seaborn 绘制了一个简单的图,它返回了一个Facetgrid对象。我使用的代码如下:

import seaborn as sns

palette = sns.color_palette("rocket_r")

g1 = sns.relplot(
    data=df,
    x="number_of_weeks", y="avg_streams",
    hue="state", col="state",
    kind="line", palette=palette,
    height=5, aspect=1, facet_kws=dict(sharex=False), col_wrap=3, 
)
Run Code Online (Sandbox Code Playgroud)

显示了以下情节: 阴谋

我正在使用的数据框具有以下结构:

   avg_streams  date    year number_of_weeks state
4   0.104011    31-01   2020    4   it
5   1.211951    07-02   2020    5   it
6   0.559374    14-02   2020    6   it
7   0.304257    21-02   2020    7   it
8   0.199218    28-02   2020    8   it
... ... ... ... ... ...
175 -0.938890   26-06   2020    25  br
176 -0.483821 …
Run Code Online (Sandbox Code Playgroud)

python matplotlib subplot line-plot seaborn

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

如何在plotly和python中使用make_subplot绘制多个图表

我正在尝试使用plotlymake_subplot绘制多个图表,其中我想绘制使用迭代for 循环创建的5 个饼图。和 1 个条形图,其中条形图将采用colspan = 2

数据框样本:

eventtype_name    date    eventmohafaza_name   number       groups
watch movie     8/14/2020   loc1                 25         group1
stay at home    8/13/2020   loc2                 20         group2
swimming        8/13/2020   loc2                 25         group4
camping         8/13/2020   loc3                 20         group3
meeting         8/13/2020   loc4                 40         group5
meeting         8/13/2020   loc5                 20         group2
watch movie     8/14/2020   loc4                 25         group1
stay at home    8/13/2020   loc1                 20         group2
swimming        8/13/2020   loc5                 25         group4
camping         8/13/2020   loc4                 20         group3
meeting         8/13/2020 …
Run Code Online (Sandbox Code Playgroud)

python pandas subplot plotly

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

你能改变情节中的子情节标题位置吗?

当将 subplot_title 添加到我的子图中时,我的标题与我的轴重叠。我可以像 matplotlib 那样改变子图标题的位置吗ax.set_title('title', y=1.5)

这是我的情节,你可以看到舞蹈能力重叠: 在此输入图像描述

到目前为止,这是我的代码:

from plotly.subplots import make_subplots
categories = ['key', 'acousticness', 'danceability', 'energy',  'loudness',
         'speechiness', 'tempo','key']

fig = make_subplots(rows=1, cols=2, specs=[[{"type":"polar"}, {"type":"polar"}]],
                    subplot_titles=('Clustering Into 8 Playlists', 'Clustering Into 11 Playlists'))

fig.add_trace(go.Scatterpolar(
          r=x,
          theta=categories,
          fill='toself',
          name='Cluster 1',
           visible='legendonly'
    ), row=1, col=1)

fig.add_trace(go.Scatterpolar(
          r=y,
          theta=categories,
          fill='toself',
          name='Cluster 2',
           visible='legendonly'
    ), row=1, col=2)

fig.update_layout(height=600, width=1400, title_text='Radar Plot of All Clusters (Fig.4)')
fig.show()
Run Code Online (Sandbox Code Playgroud)

python subplot plotly

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

在多个图上绘制多列分组

我有这样的数据

ID    value_y   date_x      end_cutoff
1      75     2020-7-1      2021-01-17
1      73     2020-7-2      2021-01-17
1      74     2020-7-1      2021-06-05
1      71     2020-7-2      2021-06-05
2      111    2020-7-1      2021-01-17
2      112    2020-7-2      2021-01-17
2      113    2020-7-1      2021-06-05
2      115    2020-7-2      2021-06-05
   
Run Code Online (Sandbox Code Playgroud)

我想绘制以下数据以满足以下条件:

  1. 每个ID有1张图
  2. 每个图表都绘制了 n 条线(本例中为 2 条;每个 end_cutoff 为 1 条)

因此,理想情况下,在这个示例中,我将有两个单独的图,每个图都有两条线。

目前,这是我拥有的代码,但它将它们全部绘制在同一个图上,而不是为每个 ID 绘制一个新图。

 grouped = df_fit.groupby(['ID','end_cutoff'])
 fig, ax = plt.subplots()
 for (ID, end_cutoff), df_fit in grouped:
     ax.plot(df_fit['date_x'], df_fit['value_y'], label=ID+' '+str(end_cutoff.date()))
 plt.show()
Run Code Online (Sandbox Code Playgroud)

python matplotlib python-3.x pandas subplot

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

使用函数和循环创建子图

我有一个很好的函数,可以用两条线绘制一个图……它本身就可以很好地工作。然而,我想运行它 4 次以制作 2row x 2col 子图。我找不到一种好方法来多次运行该函数并将每个函数添加到子图中。

import matplotlib.pyplot as plt

patient = [['P1', [1,6,12,18,24], [15,17,16,19,15]],
           ['P2', [1,6,12,18,24], [12,13,17,18,18]],
           ['P3', [1,6,12,18,24], [19,19,12,11,9]],
           ['P4', [1,6,12,18,24], [8,7,3,12,15]]]

def plot_graph(patient):
    name = patient[0]
    X = patient[1]
    Y = patient[2]

    fig, ax = plt.subplots()

    #first line
    ax.plot([X[0],X[-1]],[Y[0],Y[-1]+20], marker='o', label='Line 1')

    #second line
    ax.plot(X,Y,marker='o',label='Line 2')

    #axis settings
    ax.set_ylim([0,80])
    ax.invert_yaxis()
    ax.set_title('My Graph')
    for x,y in zip(X,Y): ax.annotate(y,(x,y-4))
    ax.legend(loc=8)


plot_graph(patient[0])

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

python plot matplotlib subplot

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

在绘制颜色条时强制使用方形子图

我正在尝试并排生成两个子图,共享y轴,两个都有一个颜色条.

这是我的代码的MWE:

import matplotlib.pyplot as plt
import numpy as np

def rand_data(l, h):
    return np.random.uniform(low=l, high=h, size=(100,))

# Generate data.
x1, x2, y, z = rand_data(0., 1.), rand_data(100., 175.), \
rand_data(150., 200.), rand_data(15., 33.)

fig = plt.figure()
cm = plt.cm.get_cmap('RdYlBu')

ax0 = plt.subplot(121)
plt.scatter(x1, y, c=z, cmap=cm)

ax1 = plt.subplot(122)
# make these y tick labels invisible
plt.setp(ax1.get_yticklabels(), visible=False)
plt.scatter(x2, y, c=z, cmap=cm)

cbar = plt.colorbar()
plt.show()
Run Code Online (Sandbox Code Playgroud)

返回的是左侧子图,水平比右侧略大,因为最后一个包含颜色条,见下图:

在此输入图像描述

我尝试过使用ax.set_aspect('equal')但由于x轴不在同一范围内,结果看起来很糟糕.

我需要将这两个图都显示为平方.我怎样才能做到这一点?

python plot matplotlib colorbar subplot

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