相关疑难解决方法(0)

减少绘图滴答数

我的图表上有太多的刻度线,它们相互碰撞.

如何减少蜱的数量?

例如,我有蜱:

1E-6, 1E-5, 1E-4, ... 1E6, 1E7
Run Code Online (Sandbox Code Playgroud)

我只想要:

1E-5, 1E-3, ... 1E5, 1E7
Run Code Online (Sandbox Code Playgroud)

我已经尝试过了LogLocator,但是我还没弄清楚这一点.

python matplotlib

137
推荐指数
7
解决办法
14万
查看次数

在matplotlib colorbar中隐藏每个第n个刻度标签最干净的方法?

我的水平颜色条上的标签太靠近了,我不想进一步减小文字大小:

cbar = plt.colorbar(shrink=0.8, orientation='horizontal', extend='both', pad=0.02)
cbar.ax.tick_params(labelsize=8)
Run Code Online (Sandbox Code Playgroud)

带有坏标签的水平颜色条

我想保留所有刻度,但删除所有其他标签.

我发现的大多数示例都将用户指定的字符串列表传递给cbar.set_ticklabels().我正在寻找一个通用的解决方案.

我玩弄各种变化

cbar.set_ticklabels(cbar.get_ticklabels()[::2])
Run Code Online (Sandbox Code Playgroud)

cbar.ax.xaxis.set_major_locator(matplotlib.ticker.MaxNLocator(nbins=4))
Run Code Online (Sandbox Code Playgroud)

但我还没有找到神奇的组合.

我知道必须有一个干净的方法来使用定位器对象.

python matplotlib

35
推荐指数
4
解决办法
3万
查看次数

如何改变matplotlib中的滴答间距?

我想使用以下代码在X轴上绘制一个带有许多刻度的图形:

import pylab

N = 100
data = pylab.np.linspace(0, N, N)

pylab.plot(data)

pylab.xticks(range(N)) # add loads of ticks
pylab.grid()
pylab.tight_layout()
pylab.show()

pylab.close()
Run Code Online (Sandbox Code Playgroud)

结果图如下所示:

情节

正如您所看到的,X轴是一团糟,因为刻度标签的绘制空间太小甚至重叠.

我想在每个刻度标签之间自动创建恒定的空间,无论有多少刻度.因此,我想增加单个刻度之间的空间,从而可能增加绘图的"长度".

请注意,刻度标签可以是可变长度的字符串.

到目前为止我发现的是关于轴和标签之间的间距(这不是我想要的),刻度频率(我已经可以做)和刻度参数(似乎没有任何间距选项).

我可以手动更改图形的大小matplotlib.pyplot.figure(figsize=(a, b)),但这需要知道刻度线之间的默认间距(据我所知,没有)和刻度标签的最大宽度(以英寸为单位),我没有如何衡量,所以这不是一个选择,在我看来.

我该怎么做才能增加蜱之间的间距?得到一个相当冗长的图像我很好.

python plot matplotlib

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

如何设置pi的倍数(Python)(matplotlib)

我想在Python中制作一个情节,并且x范围显示为pi的倍数.

有没有一个很好的方法来做到这一点,而不是手动?

我正在考虑使用matplotlib,但其他选项都很好.

编辑3:EL_DON的解决方案对我有用:

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

f,ax=plt.subplots(figsize=(20,10))
x=np.linspace(-10*np.pi, 10*np.pi,1000)
y=np.sin(x)

ax.plot(x/np.pi,y)

ax.xaxis.set_major_formatter(tck.FormatStrFormatter('%g $\pi$'))
ax.xaxis.set_major_locator(tck.MultipleLocator(base=1.0))

plt.style.use("ggplot")


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

赠送:

很好的正弦图

编辑2(在编辑3中解决!):EL_DON的答案似乎不适合我:

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

f,ax=plt.subplots(figsize=(20,10))
x=np.linspace(-10*np.pi, 10*np.pi)
y=np.sin(x)

ax.plot(x/np.pi,y)

ax.xaxis.set_major_formatter(tck.FormatStrFormatter('%g $\pi$'))
ax.xaxis.set_major_locator(tck.MultipleLocator(base=1.0))

plt.style.use("ggplot")

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

给我

情节

哪个看起来不对劲

python plot matplotlib axis-labels

12
推荐指数
4
解决办法
1万
查看次数

使用seaborn/matplotlib boxplot时的滴答频率

我正在用seaborn绘制一系列的箱形图

sns.boxplot(full_array)
Run Code Online (Sandbox Code Playgroud)

其中full_array包含200个数组.因此,我在x轴上有200个箱图和刻度,从0到200.

xticks彼此太靠近了,我只想展示其中的一些,例如,每隔20左右标记一次xtick.

我尝试了几种解决方案,就像这里提到的一样,但它们没有用.

每次我对xticks进行采样时,我都会得到错误的标记,因为它们的编号从0到N,单位间距.

例如,ax.xaxis.set_major_locator(ticker.MultipleLocator(20)) 我用20行标记xtick,但标签是1,2,3,4而不是20,40,60,80 ......

感谢任何善意帮助的人.

python matplotlib boxplot seaborn

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

隐藏 xticks 标签每第 n 个标签或 Pandas 绘图上的值/使 x 轴可读

由于图片的原因,问题很长,但实际内容并不多。问题在最下面。

你好,我有一系列 30000 个年龄范围从 21 岁到 74 岁的样本。系列头:

0    24
1    26
2    34
3    37
4    57
Name: AGE, dtype: int64
Run Code Online (Sandbox Code Playgroud)

我使用内置的 Pandas 功能绘制它.plot

age_series = original_df['AGE']
fig = plt.figure()
fig.suptitle('Age distribution')
age_series.value_counts().sort_index().plot(kind='bar')
Run Code Online (Sandbox Code Playgroud)

我的问题是它使 x 轴不太用户友好: 原图

我可以增加条之间的水平宽度,但我不想这样做。相反,我只想使 x 轴标签的子集可见。我尝试使用MaxNLocatorMultipleLocator添加这一行:

plt.gca().xaxis.set_major_locator(plt.MaxNLocator(10))
Run Code Online (Sandbox Code Playgroud)

但是,它没有实现我的目标,因为它现在错误地标记了条形图并删除了刻度线(我理解这一点,因为使用这些函数会更改 xticks 对象): 最大N定位器(10)

一个丑陋的解决方案是在 xticks 对象内循环:

xticks = plt.gca().xaxis.get_major_ticks()
for i in range(len(xticks)):
    if i % 10 != 0:
        xticks[i].set_visible(False)
Run Code Online (Sandbox Code Playgroud)

允许此渲染,这接近我想要的: 在此输入图像描述

然而我不满意,因为循环太天真了。我希望能够访问 xticks(标签)中的值并对其做出决定,以便能够仅显示 10 个标签的倍数。

这有效(基于这个答案):

for i, l in enumerate(labels): …
Run Code Online (Sandbox Code Playgroud)

python matplotlib python-3.x pandas axis-labels

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

选择matplotlib xticks频率

我正在使用字符串作为x标签绘制数据.我想控制标签频率,以免文本轴过载.在下面的示例中,我希望每3个刻度只看到一个标签:adgj.

在此输入图像描述

我可以这样做的一种方法是每n个元素用2个空字符串替换my_xticks元素.但我确信它提供了一种更清洁的方法.

这是代码:

import numpy as np
import matplotlib.pyplot as plt

y=np.array([4,4,4,5,5,6,5,5,4,4,4])
x = np.arange(y.shape[0])
my_xticks=['a','b','c','d','e','f','g','h','i','j','k']

plt.xticks(x, my_xticks)
plt.plot(x, y)
Run Code Online (Sandbox Code Playgroud)

python matplotlib

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

当x轴的值为字符串时,更改“刻度频率”

我有一个这样的清单:

x = ['alice', 'bob', ...] # len(x) > 100
y = [23, 323, ...] # just some number
plt.plot(x, y)
plt.show()
Run Code Online (Sandbox Code Playgroud)

绘制时,它显示x列表的每个值。有没有一种方法可以只显示某些值,x[0], x[10], ...但数字仍然相同。

我在网上发现了什么,例如在matplotlib中更改x或y轴上的“刻度频率”?全部基于x轴的值int。当x轴的值为字符串时,我不确定该怎么做。

旋转90度后

如您所见,即使我将x轴标签旋转90度,它仍然很拥挤,因此我仍然需要找到一种减少显示的x数量的方法。

python matplotlib

6
推荐指数
2
解决办法
4457
查看次数

带有匹配网格线的双Y轴

我想生成一个matplotlib折线图,其中两个变量分别显示在两个具有匹配网格线的y轴上。除了匹配的网格线部分,这一切都非常简单。以下是一些可复制的片段,包括最佳尝试。可以在末尾找到完整的代码段。


带有初始图的可重现数据框

遵循在matplotlib中向次要y轴添加y轴标签的建议,我可以生成以下代码:

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


# Dataframe with some random numbers
np.random.seed(123)
rows = 4
df = pd.DataFrame(np.random.randint(90,110,size=(rows, 2)), columns=list('AB'))
datelist = pd.date_range(pd.datetime(2017, 1, 1).strftime('%Y-%m-%d'), periods=rows).tolist()
df['dates'] = datelist 
df = df.set_index(['dates'])
df.index = pd.to_datetime(df.index)
df['B'] = df['A'] * np.random.uniform(0.6,1.4, size = 4)

# Plot 1
fig, ax = plt.subplots()
t = df.index
ax.plot(t, df['A'])
ax2 = ax.twinx()
ax2.plot(t, df['B'], color='red')
ax2.yaxis.grid(which="major", color='green', linestyle='--')

ax.legend(loc='upper left')
ax2.legend(loc='upper right') …
Run Code Online (Sandbox Code Playgroud)

python matplotlib

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

如何在matplotlib中禁用日期插值?

尽管在SO和Matplotlib的文档中尝试了一些解决方案,我仍然无法禁用Matplotlib在x轴上创建周末日期.

如您所见,它会向x轴添加不在原始Pandas列中的日期.

在此输入图像描述

我正在使用(评论的行不能成功实现我的目标)来绘制我的数据:

fig, ax1 = plt.subplots()

x_axis = df.index.values
ax1.plot(x_axis, df['MP'], color='k')
ax2 = ax1.twinx()
ax2.plot(x_axis, df['R'], color='r')

# plt.xticks(np.arange(len(x_axis)), x_axis)
# fig.autofmt_xdate()
# ax1.fmt_xdata = mdates.DateFormatter('%Y-%m-%d')

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

下面是我的Pandas数据框的示例,日期为索引:

2019-01-09  1.007042  2585.898714  4.052480e+09  19.980000  12.07     1
2019-01-10  1.007465  2581.828491  3.704500e+09  19.500000  19.74     1
2019-01-11  1.007154  2588.605258  3.434490e+09  18.190001  18.68     1
2019-01-14  1.008560  2582.151225  3.664450e+09  19.070000  14.27     1
Run Code Online (Sandbox Code Playgroud)

我发现的一些建议包括这里这里的自定义自动收报机,但是虽然我没有得到错误,但情节缺少我的第二个系列.

有关如何在matplotlib中禁用日期插值的任何建议?

python matplotlib dataframe pandas

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

标签 统计

matplotlib ×10

python ×10

axis-labels ×2

pandas ×2

plot ×2

boxplot ×1

dataframe ×1

python-3.x ×1

seaborn ×1