Python Pyplot/Matplotlib:如何实现压缩的y轴

Python Pyplot/Matplotlib:如何实现压缩的y轴,python,matplotlib,visualization,data-visualization,Python,Matplotlib,Visualization,Data Visualization,我正在使用pyplot创建一个基于Walter/Lieth可视化的climograph 正如您在图像(上面的链接)上看到的,右y轴从值100开始压缩。他们的视距变小,而数字间隔变大 我不知道如何在pyplot中实现这一点。我知道如何设置刻度值来创建自定义比例,但当然它们总是等距的。正如您在我的绘图中所看到的,右y轴上的绘图空间对应于值的间隔: 也许有人可以给一个提示,如何实现上述两个链接中显示的效果 干杯 给你举个例子: import matplotlib.pyplot as plt ax

我正在使用pyplot创建一个基于Walter/Lieth可视化的climograph

正如您在图像(上面的链接)上看到的,右y轴从值100开始压缩。他们的视距变小,而数字间隔变大

我不知道如何在pyplot中实现这一点。我知道如何设置刻度值来创建自定义比例,但当然它们总是等距的。正如您在我的绘图中所看到的,右y轴上的绘图空间对应于值的间隔:

也许有人可以给一个提示,如何实现上述两个链接中显示的效果

干杯

给你举个例子:

import matplotlib.pyplot as plt
axes = plt.axes()
axes.set_xlim([-10, 10]) #whatever, optional
axes.set_ylim([0, 1.0]) # whatever, optional
axes.set_xticks([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5])
axes.set_yticks([0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100,150,200,300])
plt.plot(x, norm.pdf(x)) #random filler
plt.plot(x, norm.pdf(x, 70.0, 0.1)) #another absolutely random filler
plt.show()
我的示例仅显示了如何调整Y坐标刻度,正如您所想的那样。对不起,显然帮不了你什么忙。我一点也不理解否决票。我想可能会有更好的答案

对于样本(数据)的实际压缩,有几种方法:

  • 使用函数缩放数据。可能是分步定义的。i、 e.对于0 解决方案 下面是一个基于Attersons答案的解决方案示例。比例函数取自答案

    从matplotlib导入pyplot作为plt
    def刻度(val、src、dst):
    """
    将给定值从src比例调整为dst比例。
    """
    返回((val-src[0])/(src[1]-src[0])*(dst[1]-dst[0])+dst[0]
    #实际数据
    数据=[20,50,100,250,600,200,150,100,40,30,25,20]
    源_标度=(100600)#标度值介于100和600之间
    目的地_标度=(100150)#标度介于100和150之间
    #对大于或等于100的所有数据项应用比例
    数据刻度=[x如果x<100,则x为数据中x的其他刻度(x,源刻度,目标刻度)]
    #设置一个简单的绘图
    图=plt.图()
    ax=plt.轴(图[0,0,1,1])
    图添加_轴(ax)
    #将y记号设置为自定义比例
    ax.集合校验([0,20,40,60,801001010120130140150])
    ax.set_ylim(0,150)
    #将标签设置为实际值
    ax.设置标签([“0”、“20”、“40”、“60”、“80”、“100”、“200”、“300”、“400”、“500”、“600”))
    ax.绘图(数据/比例)
    

    谢谢您的回答!也许我对我的问题描述不够清楚。我知道如何调整y轴刻度。我不知道的是如何调整它,以实现轴的压缩,如我所发布的。在我的示例绘图和您的示例代码中,间隔的大小对应于刻度之间的绘图空间。在我发布的链接中,刻度之间的间隔保持不变,尽管间隔变大了。我希望我能澄清我的意图。好的,我添加了一个链接,用于查看日志刻度。或者,您可以重新标记记号,并使用一个函数将数据从域Y1重新缩放到域Y2,甚至可以重新缩放组合谢谢!我按照你的建议使用了一个函数来缩放数据。成功了。我在我的原始帖子中添加了一个示例解决方案!请不要在问题中提供答案。相反,你可以回答自己的问题。我现在是为你做的。
    from matplotlib import pyplot as plt
    
    def scale(val, src, dst):
            """
            Scale the given value from the scale of src to the scale of dst.
            """
            return ((val - src[0]) / (src[1]-src[0])) * (dst[1]-dst[0]) + dst[0]
    
    # Actual data
    data = [20, 50, 100, 250, 600, 200, 150, 100, 40, 30, 25, 20]
    
    source_scale = (100, 600) # Scale values between 100 and 600
    destination_scale = (100, 150) # to a scale between 100 and 150
    
    # Apply scale to all items of data that are above or equal to 100
    data_scaled = [x if x < 100 else scale(x, source_scale, destination_scale) for x in data]
    
    # Set up a simple plot
    fig = plt.figure()
    ax = plt.Axes(fig, [0.,0.,1.,1.])
    fig.add_axes(ax)
    
    # Set the y-ticks to a custom scale
    ax.set_yticks([0,20,40,60,80,100,110,120,130,140,150])
    ax.set_ylim(0, 150)
    # Set the labels to the actual values
    ax.set_yticklabels(["0","20","40","60","80","100","200","300","400","500","600"])
    
    ax.plot(data_scaled)