2017-04-22 14 views
1

私は、一連のユーザー入力値からヒストグラムをプロットしようとしています。Python:ヒストグラムを下にプロットする

はさて、私はこれに私のコードを更新:

number1 = "" 
number2 = "" 
number3 = "" 
number4 = "" 

numbers = input("Enter a string of positive integers separated by spaces: ") 
print(" ") 
newNum = numbers.split() 

line = 0 
col = 0 
lines = int(max(newNum)) 
length = len(newNum) 

while line<lines: 
    col = 0 
    while col<length: 
     if line<int(newNum[col]): 
      print('* ', end = '') 
     else: 
      print(' ') 
     col = col+1 
    line = line+1 
    print("") 

しかし、私は、コードを実行したとき、私はこの取得:

Enter a string of positive integers separated by spaces: 1 3 20 5 

* * * * 

* * * 

* * * 


* * 


* * 

が、私はこのように印刷するには、私のヒストグラムを取得するために、今何をしないのです?また、値を20に印刷しないのはなぜですか?

Enter a string of positive integers separated by spaces: 1 3 20 5 

* * * * 
    * * * 
    * * * 
    * * 
    * * 
    * 
    * 
    * 
    * 
    * 
    * 
    * 
    * 
    * 
    * 
    * 
    * 
    * 
    * 
    * 
+0

あなたは何を試してみましたか?あなたはどこにいらっしゃいますか? [How to ask](https://stackoverflow.com/questions/ask/advice?)をご覧ください。 –

+0

上記のコードは私が得た限りです。私はちょうどそれを反転させる方法を必ずしも分かりません。 –

+0

あなたのアプリケーションはわかりませんが、バーグラフにscipyまたはmatplotlibを使用するオプションはありますか? – Kev1n91

答えて

0

をあなたはcolをリセットすることはありませんあなたの例では、あなたはおそらくループ間に、第2の開始前にcol=0たびに設定する必要があります。

while line<lines: 
    col=0 
    while col<length: 
     ... 

そうでない場合は、内側のループは1回だけ実行されます。

ネストされたforループは、そのため、より自然かもしれません...

と行の内側に印刷するときに、あなたは何の終了行の文字を望んでいません。 print('* ', end='')を使用し、すべての行の末尾に空のprint()を使用する必要があります。

、あなたはすぐにpossilbeとして整数に自分の番号を変換する必要があります。

newNum = [int(i) for i in numbers.split()] 

そうmax(newNum)'5'返します - 文字列中の最上位桁を。

print(' ')ステートメントにはまだ番号がなく、end=' 'があります。

これで問題が解決するはずです。


よりエレガントなバージョン - リストまで番号のリストをカウントダウンがゼロだけで構成されています

def vertical_histo(number_list): 
    rest = number_list 
    while any(rest): 
     print(' '.join('*' if i else ' ' for i in rest)) 
     rest = [i-1 if i else 0 for i in rest] 

# to get your example, call this function with: 
vertical_histo(number_list=(1, 3, 20, 5))) 

restあなたはまだ、各列

に表示する必要がある *の量を保持しています
rest = (1, 3, 20, 5) # first round 
rest = [0, 0, 17, 2] # after 3 rounds 
# ...etc 
rest = [0, 0, 1, 0] # last round 
rest = [0, 0, 0, 0] # when done 

これらは、各繰り返しで1つ下に(右に)シフトされます。

' '.join('*' if i else ' ' for i in ones) 

これは、まだゼロではないrest内のすべてのエントリの'*'を持つ文字列を作成します。それ以外の場合は' 'が追加されます。

any(rest)は、onesに0以外のエントリが含まれている限り、Trueです。

0

あなたは手動でプログラムする必要があります。

たとえば、要素が要素以下の行にある場合などです。 この荒いサンプルはあなたを導く必要があります。

line = 0 
col = 0 
lines = max(newNum) 
length = len(newNum) 

return  
while line<lines: 
    while col<length: 
     if line<newNum[col]: 
      print "* ", 
     else: 
      print " ", 
     col = col+1 
    line = line+1 
    print "" 
0

ありがとうございます!

data = [3, 5, 2] 

どのように多くの行あなたが印刷しようとしている

number1 = "" 
number2 = "" 
number3 = "" 
number4 = "" 

numbers = input("Enter a string of positive integers separated by spaces: ") 
print(" ") 
newNum = [int(i) for i in numbers.split()] 

line = 0 
col = 0 
lines = int(max(newNum)) 
length = len(newNum) 

while line<lines: 
    col = 0 
    while col<length: 
     if line<int(newNum[col]): 
      print('* ', end = '') 
     else: 
      print(' ', end = '') 
     col = col+1 
    line = line+1 
    print("") 
0

はのは、あなたのヒストグラムの各列の深さを含むリストに名前dataを挙げてみましょう:このコードでは、私は疑問を解決することができました?あなたが行をカウントするためのPythonを頼む場合

nrows = max(data) #=> 5 

は、Pythonは0から始まり、無nrows-1

for row in range(nrows): print(row) #=> 0 1 2 3 4 

ので行で停止します。 3は、インデックスrow2と等しい行番号を持ちます。 4行4番(すなわち、row=3

にインデックス 3、今、この行の3番で '+'を意味 、あなたは3 '+'を印刷する必要があり、ヒストグラムの最初の列を考える(すなわち、 row=2)と何を持っています私たちは、ヒストグラム

def histogram(data): 
    return '\n'.join(
     ''.join('+' if depth>row else ' ' for depth in data) 
     for row in range(max(data))) 

を計算する関数を書くことができ、我々はそれをテストする準備が整いました。この分析の後

'+' if (data[col] > row) else ' ' 

In [36]: def histogram(data): 
    ...:   return '\n'.join(
    ...:    ''.join('+' if depth>row else ' ' for depth in data) 
    ...:    for row in range(max(data))) 
    ...: 

In [37]: print(histogram((3,4,5,6))) 
++++ 
++++ 
++++ 
+++ 
    ++ 
    + 

In [38]: 

あるいは、短く、

In [38]: def histogram(d, nl='\n'.join, jn=''.join): 
...:  return nl(jn('+'if n>r else' 'for n in d)for r in range(max(d))) 
...: 

In [39]: print(histogram((3,4,5,6))) 
++++ 
++++ 
++++ 
+++ 
    ++ 
    + 

In [40]: 
関連する問題