在matplotlib中具有重复值(加载轮廓)的x轴

时间:2012-07-24 09:12:42

标签: python excel graph plot matplotlib

我有负载配置文件数据,其中x轴是负载配置文件,因此对于多个相同的x值(恒定负载),我有不同的y值。 到目前为止,在Excel中,我习惯于绘制图y和右键单击图形 - > selec data->通过提供范围o x轴数据来更改水平轴数据,并用于给出图表

Sample Chart

我遇到的问题是当我试图给予时 plot(x,y),matplotlib绘制y表示x的唯一值,即它忽略了x的相同值的所有剩余值。 当我用绘图(y)绘图时,我得到x轴上的序列号 我试过xticks([0,5,10,15])检查但无法得到所需的结果。 我的问题是 是否有可能以类似于excel的方式绘制图形 我想到的另一种选择是绘制情节(y和情节(x)与相同的水平轴它至少给出了一个图画的想法,但是有没有办法去做excel方式??

4 个答案:

答案 0 :(得分:0)

如果要为给定的y-values绘制x-values,则需要获取具有相同x值的索引。如果您正在使用numpy,那么您可以尝试

import pylab as plt
import numpy as np
x=np.array([1]*5+[2]*5+[3]*5)
y=np.array([1,2,3,4,5]*3)
idx=(x==1) # Get the index where x-values are 1
plt.plot(y[idx],'o-')
plt.show()

如果您正在使用列表,则可以通过

获取索引
# Get the index where x-values are 1
idx=[i for i, j in enumerate(x) if j == 1] 

答案 1 :(得分:0)

从你的描述中,我觉得你想要使用“scatter”绘图命令而不是“plot”plotting命令。这将允许使用冗余的x值。示例代码:

import numpy as np
import matplotlib.pyplot as plt

# Generate some data that has non-unique x-values
x1 = np.linspace(1,50)
y1 = x1**2
y2 = 2*x1
x3 = np.append(x1,x1)
y3 = np.append(y1,y2)

# Now plot it using the scatter command
# Note that some of the abbreviations that work with plot,
# such as 'ro' for red circles don't work with scatter
plt.scatter(x3,y3,color='red',marker='o')

scatter plot

正如我在评论中提到的,一些方便的“情节”快捷方式不适用于“分散”,因此您可能需要查看文档:{​​{3}}

答案 2 :(得分:0)

回答自己的问题,几年前我发布这个问题时发现了这个问题:)



def plotter(y1,y2,y1name,y2name):
    averageY1=float(sum(y1)/len(y1))
    averageY2=float(sum(y2)/len(y2))
    fig = plt.figure()
    ax1 = fig.add_subplot(111)  
    ax1.plot(y1,'b-',linewidth=2.0)
    ax1.set_xlabel("SNo")
    # Make the y2-axis label and tick labels match the line color.
    ax1.set_ylabel(y1name, color='b')
    for tl in ax1.get_yticklabels():
        tl.set_color('b')
    ax1.axis([0,len(y2),0,max(y1)+50])
    
    ax2 = ax1.twinx()
    
    ax2.plot(y2, 'r-')
    ax2.axis([0,len(y2),0,max(y2)+50])
    ax2.set_ylabel(y2name, color='r')
    for tl in ax2.get_yticklabels():
        tl.set_color('r')
    plt.title(y1name + " vs " + y2name)
    #plt.fill_between(y2,1,y1)
    plt.grid(True,linestyle='-',color='0.75')

    plt.savefig(y1name+"VS"+y2name+".png",dpi=200)




答案 3 :(得分:0)

你可以使用

import numpy as np
import matplotlib.pyplot as plt

x = np.array([1, 1, 1, 2, 2, 2])
y = np.array([1, 2, 1, 5, 6, 7])

fig, ax = plt.subplots()
ax.plot(np.arange(len(x)), y)
ax.set_xticklabels(x)
plt.show()