我在 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是关闭的。我认为底部单元格的值是正确的,因为由于 …
我试图绘制表情符号在不同类型的推文(“正常”推文、转发和回复)中的使用频率。为此,我使用 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) 我想生成一个半笛卡尔半极坐标图。例如,高斯曲线的一半采用极坐标格式,另一半采用笛卡尔格式。哪个是最好的方法?

我尝试过共享 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) 我有一个数据框 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)
然而,这并没有给我单独的标题,我想为情节添加更多功能。
我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) 我正在尝试使用plotly和make_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) 当将 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) 我有这样的数据
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)
我想绘制以下数据以满足以下条件:
因此,理想情况下,在这个示例中,我将有两个单独的图,每个图都有两条线。
目前,这是我拥有的代码,但它将它们全部绘制在同一个图上,而不是为每个 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) 我有一个很好的函数,可以用两条线绘制一个图……它本身就可以很好地工作。然而,我想运行它 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) 我正在尝试并排生成两个子图,共享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轴不在同一范围内,结果看起来很糟糕.
我需要将这两个图都显示为平方.我怎样才能做到这一点?